したがって、Scheme では define が動的スコープ用であり、let が静的スコープ用であることを知っていますが、次のことは私を混乱させます。
私が持っている場合
(let ((x 0))
(define f (lambda () x))
(display (f))
(let ((x 1))
(display (f))
)
)
00 が表示されます。ただし、次のように x の定義を追加すると、次のようになります。
(let ((x 0))
(define f (lambda () x))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
undefined4 と表示されます。どうしてこれなの?f を評価した後にx を定義すると (f) の戻り値に影響するのはなぜですか? そして、戻り値が「未定義」なのはなぜですか?
また、define の代わりに letrec を使用して f をバインドしても機能することにも言及する価値があります。
(let ((x 0))
(letrec ((f (lambda () x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
00 を返します。
注: DrRacket の言語を「Pretty Big」に設定して使用しました。