>>63
そのコードは意味的にこれと同じ
let x=5 in let f a=a+x in let g a=f a in let f a =a-x in let x=7 in f 35
つまり、 x=7 は新しい環境で x という名前の変数を作っているので、
関数 f や g の中で参照している x は依然としてそのまま存在している。
Scheme で言えば
(let ((x 5))
(let ((f(lambda(a)(+ a x))))
(let ((g(lambda(a)(f a))))
(let ((f(lambda(a)(- a x))))
(let ((x 7))
(f 35))))))
ってこと。
define が set! の意味になる場合があるのが混乱の元だな。
r6rs で禁止にしたのは良い選択だと思う。