昨日、add-nをdefineするときにエラーにならなかった。
何故なのか、ド素人なりに考えてみた。
lambda式を評価して手続きオブジェクトを作成するとき、出現した変数が束縛されているか否かは、トップレベルまで見に行けば決定できる。
(define mul (lambda (n) (lambda (m) (* n m))))
とか考えると、
(lambda (m) (* n m))
だけを見ると、nは束縛されていないように見えるけど外側のlambdaで束縛されてるから、OKみたいな。
だから、やっぱりエラーにすることは出来るような気もするけど、現時点では、僕の良く分からない大人の事情があるのだと思っておこう。
そもそも変数はどこかで束縛されているべきで、束縛されていない変数がソースコード中に出てくることは間違い。
だからλ抽象の段階ではチェックしない。
...そういうことなのかな。