What is :-) ?

Antonio antoniocabreraperez at gmail.com
Tue Nov 21 14:41:52 UTC 2023


On Monday, 20 November 2023 at 16:32:22 UTC, evilrat wrote:

>
> ```d
> // this is a function returning a delegate
> auto createCounter(int nextValue) => auto delegate() => 
> nextValue++;
>

Thank you!!!.

Compiler forces me to omit "auto" keyword

```d
auto createCounter(int nextValue) => delegate () => nextValue++ ;
```

Explicit return must be specified after "delegate" keyword

```d
auto createCounter(int nextValue) => delegate int () => 
nextValue++ ;
```

When declaring a type (variable or parameter) is when keywords 
order must be "inverted"

```d
import std.stdio;
int callWith10( int delegate (int) x) =>x(10);
void main(){
   int j=100;
   // Explicit
   writeln( callWith10( delegate int (int i)=>i+j ) );
   // Inferred
   writeln( callWith10( i=>i+j ) );
   // OMG
   writeln( ( i=>i+j ).callWith10 );
}
```



> // this is a function returning a function
> auto createCounter(int nextValue) => auto function() => 
> nextValue++;
> ```

I think this will not work, because nextValue is defined out of 
the returned function scope:  you must return a closure 
(delegate).

Thanks a lot evilrat!!!

**From your answer (and other ones too) I have to say that...**

* **D Closures rocks!!!**  It is hard to find something so 
powerful in other natively compiled languages:  **Heap + GC** has 
it's advantages.

* **D offers nice syntax features**:  you can declare arrow 
methods very similar to dart, or assign an arrow 
function/delegate to a variable like Javascript/Typescript 
lambdas.












More information about the Digitalmars-d-learn mailing list