Y-combinator を理解
再帰を無名関数で行う法。
要するに引数の一つに自分への参照にしちゃう訳ですね。
最小二乗法の検算にlisp使ってて、リストの長さを出す関数をふとワンライナー的に書きたくなって理解してしまった・・・(間抜けな動機。length使えば良いじゃんねえ・・・)
1:((lambda (f seq) (f f seq 0)) 2: (lambda (f seq c) 3: (if (null? seq) c 4: (f f (cdr seq) (+ c 1)))) 5: data ))
肝は4行目の "(f f"で引数として先の再帰に自分を繋ぐ、という部分。自分のlambdaを評価中に、自分をバインドできるのが引数しか無いと。別の見方をすれば 引数にすることで遅延させている、と理解しました。letで書けないかとか考えたけど、ダメ。なるほ〜ど。なのでした。
lisp経験の浅い私にはまだ、ぱっとコードを見て 2-4行と 5行が最初のlambda の引数2つだというのが直感できないです。経験と言うより頭の悪さかもしれませんが T^T