Итак, я знаю, что в схеме определение предназначено для динамической области видимости и пусть для статической области видимости, но меня смущает следующее:
Если бы у меня был
(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. Почему это? Почему определение x после вычисления f влияет на возвращаемое значение (f)? И почему возвращаемое значение «не определено»?
Также стоит упомянуть, что привязка f к letrec вместо define также будет работать:
(let ((x 0))
(letrec ((f (lambda () x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
Возвращает 00.
Примечание. Я использовал DrRacket с установленным языком «Pretty Big».
set!
. Но это хлопотно и запутанно. Фактически, ваш первый фрагмент кода даже не скомпилируется в стандартном Racket, поскольку компилятор заранее скажет, что повторяющееся определение является незаконным. - person dyoo   schedule 19.02.2013