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?