闭包和动态范围

时间:2011-11-23 09:59:01

标签: lisp implementation

我正在开发一个受picolisp启发的玩具lisp实现。因此,只有动态范围的变量(加上文件局部变量)。最近我想知道,是否可以为该语言添加闭包。目前,lambda表达式中引用的所有变量的绑定都存储在表达式的激活记录中(即在lisp实现的显式堆栈上),并在完成该lambda表达式的执行时恢复。应该可以通过保存闭包引用的符号的绑定来实现闭包,然后在闭包执行期间恢复闭包所包含的绑定,然后恢复先前的绑定。

现在问题:这是否等同于词法闭包?

1 个答案:

答案 0 :(得分:1)

根据saving the bindings...的含义,这是一个很好的词汇闭包模拟,它并不完全相同。

(defun closure ()
  (let ((var "first value"))
    (format #t "Value is ~a" var)
    (let ((closure (lambda () (format #t "Value inside the closure ~a" var))))
      (setf var "second value")
      (funcall closure))))

如果保存闭包的绑定值,则会得到以下输出:

Value is first value
Value inside the closure first value

这意味着你的闭包没有看到 var的变异。因为它只在构建闭包时保存了当前值。

如果保存完整绑定(变量及其值),并且对此变量的所有引用都使用相同的绑定(变量和值),那么您将获得词法闭包。

虽然因为在调用闭包时发生了大量复制,但效率并不高。