できない…

さあ、Yコンビネータ(不動点演算子)を使おう! - よくわかりませんを写経してみようとしたけど、できてないというメモ。

Z = fn(f, fn(x, fn(m, f call(x call(x)) call(m))) call(fn(x, fn(m, f call(x call(x)) call(m)))))
F_for_fib = fn(f, fn(n, if(n < 2, n, f(n-1) + f(n-2))))
gen_memorizer = fn(f, let(x, x = {}. fn(n, if(x[n], x[n], x[n] = f(n)))))
wrap = fn(F, g, fn(f, F call(g call(f))))
fib = Z(wrap(F_for_fib, gen_memorizer))
fib(20) ;costs much...

クロージャの使い方? let(x, x = {}...辺りが変なんだろか。
↓が動くから、一応それなりに動いてるっぽいはずなんだけど…。

c = let(n, n = 0. fn(n = n + 1))
c call ; +> 1
c call ; +> 2
c call ; +> 3

なんか、毎回、キャッシュが初期化されてるような雰囲気もあるんだよね。

ちなみに、18のフィボナッチ数の計算で5秒くらいかかります。iokeは遅い。