首页 > 解决方案 > Scheme语言中的词法与动态解释器

问题描述

我仍然不明白动态解释器与词汇解释器有何不同。

我正在研究方案,我发现很难知道像这样的简单代码如何动态地和词法地工作。

(define mystery
  (let ((x 2018))
    (lambda (y)
      (let ((result (cons x y)))
         (set! x (+ x 1))
         result))))

任何指导?

标签: schemelexical-scopedynamic-scopevariable-binding

解决方案


词法绑定具有有限的可见性和无限的寿命。所有函数都“记住”它们创建的环境——这种函数称为词法闭包

在您的示例中,这部分:

(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没有价值。


推荐阅读