Can we fix this?

deadalnix deadalnix at gmail.com
Thu Sep 30 14:02:06 UTC 2021


On Thursday, 30 September 2021 at 12:55:48 UTC, Max Samukha wrote:
> Yes, that is the semantics I would expect. Note the 
> complication when vars from multiple scopes are captured:
>
> ```d
> int i = 1;
> dgList ~= { writeln(i); };
>
> while (i < 4) {
>    immutable int n = i++;
>    dgList ~= { writeln(i, " ", n); };
> }
> ```
> Expected:
> 4
> 4 1
> 4 2
> 4 3
>
>
> That would require an implementation like this:
> ```d
> static struct __C0
> {
>     int i;
>     void call() { writeln(i); }
> }
>
> auto c0 = new __C0(1);
> dgList ~= &c0.call;
>
> while (c0.i < 4) {
>    static struct __C1 {
>       __C0* c0;
>       immutable int n;
>       void call() { writeln(c0.i, " ", n); }
>    }
>
>    dgList ~= &(new __C1(c0, c0.i++)).call;
> }
> ```

That is indeed the most expected behavior that is consistent with 
D's semantic in other areas of the language - notably 
construction/destruction and immutability.


More information about the Digitalmars-d mailing list