所以我知道在 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) 的返回值?为什么返回值“未定义”?
还值得一提的是,将 f 与 letrec 而不是 define 绑定也可以:
(let ((x 0))
(letrec ((f (lambda () x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
返回 00。
注意:我使用 DrRacket 的语言设置为“Pretty Big”