Lambda functions in D

Timon Gehr via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat May 9 14:48:03 PDT 2015


On 05/09/2015 05:52 PM, Dennis Ritchie wrote:
> On Saturday, 9 May 2015 at 14:15:21 UTC, Ali Çehreli wrote:
>> On 05/09/2015 04:59 AM, Dennis Ritchie wrote:
>>> On Saturday, 9 May 2015 at 11:49:48 UTC, Timon Gehr wrote:
>>>> assert((function int(int
>>>> x)=>x?x*__traits(parent,{})(x-1):1)(10)==3628800);
>>>
>>> Thanks. Yes, it is similar to what I wanted :)
>>
>> Also interesting:
>>
>>   http://rosettacode.org/wiki/Y_combinator#D
>>
>> I think that code was improved by Timon Gehr as well.
>>
>> Ali
>
> Yes, it's much better.

Well, it is much slower due to all the allocated closures, owed to the 
fact that the implementations of 'fix' on that page are expected to 
mirror a particular famous implementation in untyped lambda calculus.

In case you have a use for 'fix', a more efficient implementation might be:

auto fix(S,T...)(S delegate(T) delegate (S delegate(T)) f){
     S delegate(T) g=(T a){ assert(0,"f is too eager."); };
     return g=f((T a)=>g(a));
}

(In particular, this will only allocate two closures for the plumbing 
instead of a number of them linear in the number of recursive invocations.)


> Even something like Common Lisp.

(Be aware that Common Lisp implementations typically have better garbage 
collectors than what is available for D.)


More information about the Digitalmars-d-learn mailing list