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