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