Value closures (no GC allocation)

deadalnix via Digitalmars-d digitalmars-d at puremagic.com
Tue May 30 12:29:38 PDT 2017


On Sunday, 21 May 2017 at 00:33:30 UTC, Vittorio Romeo wrote:
> Hello everyone, I recently started learning D (I come from a 
> Modern C++ background) and I was curious about closures that 
> require GC allocation. I wrote this simple example:
>
>     auto bar(T)(T x) @nogc
>     {
>         return x(10);
>     }
>
>     auto foo(int x) @nogc
>     {
>         return bar((int y) => x + y + 10);
>     }
>
>     int main() @nogc
>     {
>         return foo(10);
>     }
>
>
>
> It doesn't compile with the following error:
>
>     Error: function example.foo is @nogc yet allocates closures 
> with the GC
>            example.foo.__lambda2 closes over variable x at [...]
>
>
>
> Live example on godbolt: https://godbolt.org/g/tECDh4
>
>
>
> I was wondering whether or not D could provide some syntax that 
> allowed the user to create a "value closure", similar to how 
> C++ lambdas work. How would you feel about something like:
>
>
>     auto bar(T)(T x) @nogc
>     {
>         return x(10);
>     }
>
>     auto foo(int x) @nogc
>     {
>         return bar([x](int y) => x + y + 10);
>     }
>
>     int main() @nogc
>     {
>         return foo(10);
>     }
>
>
>
> The syntax:
>
>     [x](int y) => x + y + 10
>
> would mean "create a 'value closure' that captures `x` by value 
> inside it". It would be equivalent to the following program:
>
>     struct AnonymousClosure
>     {
>         int captured_x;
>
>         this(int x) @nogc
>         {
>             captured_x = x;
>         }
>
>         auto opCall(int y) @nogc
>         {
>             return captured_x + y + 10;
>         }
>     }
>
>     auto foo(int x) @nogc
>     {
>         return bar(AnonymousClosure(x));
>     }
>
>
>
> Which is very similar to how C++ lambdas work. This would allow 
> closures to be used in @nogc contexts with minimal syntactical 
> overhead over classical closures.
>
> Live example on godbolt: https://godbolt.org/g/ML2dlP
>
> What are your thoughts? Has something similar been proposed 
> before?

https://wiki.dlang.org/DIP30

Also, while no syntax is provided, this is how SDC works 
internally and this is how it can handle multiple context 
pointers.





More information about the Digitalmars-d mailing list