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

Reply via email to