@nogc closures

vit vit at vit.vit
Sun Aug 5 12:23:17 UTC 2018


On Sunday, 5 August 2018 at 10:57:32 UTC, Steven Schveighoffer 
wrote:
> On 8/5/18 5:20 AM, vit wrote:
>> It's possible create something like this without errors?
>> 
>> void main()@nogc{   //Error: function `app.main` is `@nogc`
>>                      //  yet allocates closures with the GC
>>      import std.experimental.all;
>> 
>>      const int j = 2;
>>      int i = 0;
>>      const int[3] tmp = [1, 2, 3];
>> 
>>      tmp[]
>>          .filter!((x)scope => x == j)    ///main.__lambda1 
>> closes over variable j
>>          .each!((x)scope => i = x);
>> }
>
> The issue is that filter returns a struct with the lambda in 
> it. (the FilterRange). So the compiler can't deduce that the 
> lambda never escapes.
>
> Note, in your toy example, you can fix it by making j an enum, 
> but I'm assuming this isn't possible in the real code.
>
> -Steve

Yes, it isn't possible.
I modify filter a and map from std.algorithm:

void main()@nogc{
	import std.experimental.all;
	const int j = 2;
	int i = 0;
	const int[3] tmp = [1, 2, 3];
	tmp[]
	    .xfilter!((x, j) => x == j)(j)
             .xmap!((x, j) => x * j)(j)
	    .each!((x) => i = x);
}

full code: https://dpaste.dzfl.pl/15664d6da5c8


More information about the Digitalmars-d-learn mailing list