I implemented delegates in D

maik klein via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 9 16:20:00 PDT 2016


On Thursday, 9 June 2016 at 22:06:24 UTC, Mathias Lang wrote:
> To avoid the delegate being GC allocated, use `scope foo = (int 
> i) { ... }`
> at call site.
> You can also make your function signature as `void func(scope 
> void
> delegate() dg)` in which case it won't allocate if you pass a 
> literal
> directly.
>
> 2016-06-09 23:57 GMT+02:00 maik klein via Digitalmars-d < 
> digitalmars-d at puremagic.com>:
>
>> On Thursday, 9 June 2016 at 21:32:33 UTC, Alex Parrill wrote:
>>
>>> On Thursday, 9 June 2016 at 21:02:26 UTC, maik klein wrote:
>>>
>>>> Has this been done before?
>>>>
>>>
>>> Well, yes, the entire point of delegates is to be able to 
>>> capture variables (as opposed to function pointers, which 
>>> cannot).
>>>
>>>
>>> auto createADelegate(int captured) {
>>>         return (int a) => captured + a;
>>> }
>>>
>>> void main() {
>>>         auto dg1 = createADelegate(5);
>>>         auto dg2 = createADelegate(32);
>>>         assert(dg1(5) == 10);
>>>         assert(dg1(10) == 15);
>>>         assert(dg2(8) == 40);
>>>         assert(dg2(32) == 64);
>>> }
>>>
>>> https://dpaste.dzfl.pl/90ebc29651f6
>>>
>>> (Unfortunately template delegates, like the ones used with 
>>> map, don't keep their captured variables alive after the 
>>> captured variables go out of scope, but it doesn't sound like 
>>> you need those)
>>>
>>
>> I meant, "has this been implement as a library before". I am 
>> well aware that delegates exist in the language but as far as 
>> I know you can not do manual allocation with delegates (to 
>> avoid the GC).

But that means that the closure will be allocated on the stack 
right? What happens when I send it with 
http://dpldocs.info/experimental-docs/std.concurrency.send.html

Will it copy the function or will it only send the pointer?

Also scope on local vars is marked to be deprecated, see 
http://stackoverflow.com/a/4713064/944430

I don't think that I can use delegates (without the gc), what I 
basically do is send a delegate to a thread, create a fiber on 
that thread and put it in a thread local array.

The delegate contains a "future" that I can access on a different 
thread. I use it as mechanism to share results. (Its synchronized 
with atomics)

I mean currently I just use gc delegates, but I am exploring some 
alternatives.






More information about the Digitalmars-d mailing list