How Nested Functions Work, part 1

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Sep 3 06:26:54 PDT 2009


Edward Diener wrote:
> Jarrett Billingsley wrote:
>> On Wed, Sep 2, 2009 at 9:45 AM, Andrei
>> Alexandrescu<SeeWebsiteForEmail at erdani.org> wrote:
>>> Jarrett Billingsley wrote:
>>>> Well repeat should probably always take a delegate since most likely,
>>>> you're going to be passing it a lambda. However I agree that it would
>>>> be very, very nice to be able to make APIs take just delegates and
>>>> allow functions to be implicitly cast to them. You can already make
>>>> your own thunks, but they're not going to be as efficient as something
>>>> that actually works on an ABI level.
>>> Did someone file a bug report on this?
>>
>> Surprisingly, it doesn't seem like it. Walter himself, in the spec,
>> said that "Function pointers and delegates may merge into a common
>> syntax and be interchangeable with each other," so I just assume that
>> no one has found it necessary to make a report. Maybe there should be.
> 
> I suggested this a long time back on this NG, and I am sure many others 
> have also. A function pointer should essentially be a delegate whose 
> object is null. That is essentially the way delegates are in .Net. In 
> C++, boost::Function can encompass any C++ callable type so there is 
> little theoretical reason why D should not encompass all callable types 
> into a delegate. Having to program for any callable type, in a 
> functional callable or signal/slots library, by dealing with the two 
> signature variations of a function pointer and a delegate rather than a 
> single common signature is a real PITA in an advanced programming language.

IMHO it's ok if there are two types, as long as function is implicitly 
convertible to delegate. Function pointers have the advantage that they 
are only one word in size, can be assigned to atomically, and help 
interfacing with C callback APIs.

Andrei



More information about the Digitalmars-d mailing list