The future of lambda delegates
xs0
xs0 at xs0.com
Fri Aug 18 01:50:14 PDT 2006
kris wrote:
> xs0 wrote:
>> 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
>> ...
>> }
>> }
>
> Nice, but the problem with that is as follows:
>
> When passing such a delegate as an argument, you don't know whether
> it'll be used in a synchronous or asynchronous manner.
Are you sure you don't know? I can't think of a case where I'd be in doubt..
> So, perhaps you
> choose the safe route and assume worst-case. That's cool, but if you
> choose best case instead (because you 'know' usage is synchronous) then
> you leave yourself open to nasty issues if that callee is ever changed.
> Think about passing a delegate to a third-party lib? The contract is
> weak, and therefore fragile. That's why we'd suggested an extension to
> the type system instead (which also has some problems).
Well, I think it's not as big a problem realistically.. When you provide
a delegate you need to know what its purpose is and I think that is
something very unlikely to change. The two main types of delegates seem
to be callbacks and specific operations for generic algorithms. I don't
see how a library update would change the contract between those two.
> The other thing that Mik noted is that the entire frame should be on the
> heap; not just part of it (for performance reasons)
What performance reasons? I read this entire thread and still have no
idea how copying more/all of the frame could/would be faster..
> , and taking a
> snapshot copy of the scope (or part thereof) does not work at all, since
> there could be self-references, pointers, whatever, in there. It seems
> you have to flip the entire frame into the heap.
The semantics are clear - the current values of the with() variables get
copied at the point where the delegate literal becomes "instantiated";
whatever you put there is up to you..
xs0
More information about the Digitalmars-d
mailing list