できない…
さあ、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は遅い。