On Monday, 20 November 2023 at 16:09:33 UTC, Antonio wrote:
What "breaks" my mind is that a compiler decision (treat a
piece of code as function or delegate) is not completely
transparent causing "side" effects on your code (writeln
doesn't work the same way: it shows the delegate signature,
but not the function signature).
It's certainly surprising that `writeln` treats function pointers
and delegates differently. My guess is that it's because
[`isPointer`][1] returns `true` for functions and `false` for
delegates.
[1]: https://phobos.dpldocs.info/std.traits.isPointer.html
Is there any way to force D compiler to treat this
"createCounter" declaration as **delegate** instead of
**function**?
```d
auto createCounter = (int nextValue) => () => nextValue++;
```
You can put the `delegate` keyword in front of the function
literal:
```d
auto createCounter = delegate (int nextValue) => () =>
nextValue++;
```
This syntax is documented in the spec's section on [Function
Literals][2] (look at the grammar box and the examples).
[2]: https://dlang.org/spec/expression.html#function_literals