束縛されているかどうか

昨日、add-nをdefineするときにエラーにならなかった。
何故なのか、ド素人なりに考えてみた。


lambda式を評価して手続きオブジェクトを作成するとき、出現した変数が束縛されているか否かは、トップレベルまで見に行けば決定できる。

(define mul
  (lambda (n)
    (lambda (m) (* n m))))

とか考えると、

(lambda (m) (* n m))

だけを見ると、nは束縛されていないように見えるけど外側のlambdaで束縛されてるから、OKみたいな。


だから、やっぱりエラーにすることは出来るような気もするけど、現時点では、僕の良く分からない大人の事情があるのだと思っておこう。


そもそも変数はどこかで束縛されているべきで、束縛されていない変数がソースコード中に出てくることは間違い。
だからλ抽象の段階ではチェックしない。
...そういうことなのかな。