scheme - Scheme语言中的词法与动态解释器
问题描述
我仍然不明白动态解释器与词汇解释器有何不同。
我正在研究方案,我发现很难知道像这样的简单代码如何动态地和词法地工作。
(define mystery
(let ((x 2018))
(lambda (y)
(let ((result (cons x y)))
(set! x (+ x 1))
result))))
任何指导?
解决方案
词法绑定具有有限的可见性和无限的寿命。所有函数都“记住”它们创建的环境——这种函数称为词法闭包。
在您的示例中,这部分:
(let ((x 2018))
(lambda (y) (let ((result (cons x y)))
(set! x (+ x 1)) result))))
返回函数,它记住 x = 2018 的环境。该函数绑定到符号mystery
,当您调用它时,它会更改该环境中 x 的值。
> (mystery 1)
'(2018 . 1)
> (mystery 1)
'(2019 . 1)
在具有动态绑定(无限可见性、有限生命周期)的 Scheme 中,函数不记得创建它们的环境。因此,函数mystery
不会记住 x = 2018 的环境,并且(mystery 1)
在评估期间调用以错误结束(cons x y)
,因为符号x
没有价值。