The future of lambda delegates
xs0
xs0 at xs0.com
Fri Aug 18 08:14:25 PDT 2006
Bruno Medeiros wrote:
> xs0 wrote:
>> Mikola Lysenko wrote:
>>> [snip]
>>> Any thoughts or comments?
>>
>> Well, to me it seems that anything the compiler will try to do
>> automatically will be wrong (or at least needlessly slow) in many
>> cases. And a lot of the problem seems to be simply that one can't
>> attach storage to a delegate without creating a whole class/struct,
>> and doing that is too verbose to be used easily/often.
>>
>> So, why not simply have some syntax sugar for that?
>>
>> int delegate() fibs()
>> {
>> int a=0, b=1;
>> return delegate with(a,b) { // it takes a and b with it
>> ...
>> }
>> }
>>
>> Which would become exactly what you proposed.
>>
>>
>> xs0
>
> Would the instances of a & b of the fibs function be the same as the
> ones in the delegate? In other words, does the "with(a,b)" create a heap
> copy of a & b, for the delegate to use, or does it cause the original
> "int a=0, b=1;" to be heap allocated?
A heap copy is created at the point in code where the delegate is
"evaluated". For example, the above case would function exactly the same
as the following:
int delegate() fibs()
{
int a=0, b=1;
auto result = delegate with(a,b) {
...
}
a = 5000;
b = -1;
return result;
}
because it would become this behind the scenes:
class _anonymousclass123 // more probably struct
{
int a, b;
this(int a, int b) {
this.a=a; this.b=b;
}
int _anonymousfunc() {
...
}
}
int delegate() fibs()
{
int a=0, b=1;
auto result = &((new _anonymousclass123(a, b))._anonymousfunc);
a = 5000;
b = -1;
return result;
}
Of course, the compiler is free to allocate the fibs()'s a and b on the
heap, if it determines the result is the same (it's potentially better
because less stack is used), though I don't think it would actually
matter in any realistic case..
xs0
More information about the Digitalmars-d
mailing list