Scheme の自由変数

http://d.hatena.ne.jp/cranebird/20081221/1229816029 で shiro さんに頂いたコメント。

1)
「この範囲には絶対に自由変数はないよ」とするととても大変なような。構文識別子は許すとしても、consもcarもcdrも使えなくなります。

2)
(lambda (x) (lambda (y) (car (foo (x y))))
という式なら、xとyは束縛されていますがcarとfooは束縛されていません。

せっかくコメントを頂いておきながら理解できずにいたのだが、うあー、1)2)とも完全に正確な(ほとんどこれ以外に書きようの無い)コメントを頂いていたことがやっと分かった。cons も car も cdr も特別なトップレベルを考えなければ束縛されていないのか。(自分はなんとなく頭の中で Common Lisp の CL-User パッケージみたいなものを想定していたらしい。何と愚かな自分、、)

let か lambda が束縛するだけで、let 式は結局 lambda だから、束縛を作るのは lambda だけか。とすれば、S式中の自由変数を探すのは再帰的にほとんど compile と同じ手順を踏めば自由変数が探せる、か。


続く。