@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