05/06/28 12:56:20
理解に苦しんでいるstatic scopeの話がちょうど出たようですので、
質問させてください。
;;; 例-A ----------------------------------------
A1> (define foo begin)
A2> (define bar (lambda (a b c) (foo a b c)))
A3> (bar #t 0 1)
;;==> 1
A4> (define foo list)
A5> (bar #t 0 1)
;;==> 1
;;; 例-B ----------------------------------------
B1> (define foo (lambda (m) (- m 3)))
B2> (define bar (lambda (n) (foo n)))
B3> (bar 10)
;;==> 7
B4> (define foo (lambda (m) (+ m 3)))
B5> (bar 10)
;;==> 13
例-Aのほうは、fooをtop-levelで再定義(A4)しても、
barを呼び出したとき(A5)には、手続き定義時(A2)の
環境が使われています。
これはstatic scopeの考え方からすると当然だと
思えるようになりました。
ところが、例-Bのほうは、
fooを再定義(B4)すると、手続き呼び出し時(B5)には
手続き定義時(B2)のfooではなく、再定義されたfooが
使われています。
この違いは何でしょうか?