所以我知道在Scheme中定义的是动态作用域,并且允许静态作用域,但是下面的内容让我困惑:
如果我有
(let ((x 0))
(define f (lambda () x))
(display (f))
(let ((x 1))
(display (f))
)
)
Run Code Online (Sandbox Code Playgroud)
它将显示00.到目前为止一切顺利.但是,如果我为x添加额外的定义,如下所示:
(let ((x 0))
(define f (lambda () x))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
Run Code Online (Sandbox Code Playgroud)
它将显示undefined4.为什么是这样?为什么在评估f 之后定义x 会影响(f)的返回值?为什么返回值"未定义"?
还值得一提的是,用letrec而不是define绑定f也会起作用:
(let ((x 0))
(letrec ((f (lambda () x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
Run Code Online (Sandbox Code Playgroud)
返回00.
注意:我使用了DrRacket,上面写着"Pretty Big"