On Saturday, 9 May 2015 at 21:48:05 UTC, Timon Gehr wrote:
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.)

Maybe in the future, that D will be added to optimize tail recursion delegates?
And why garbage collectors in Lisp is better?

Reply via email to