【发布时间】:2014-11-14 15:10:59
【问题描述】:
在 Common Lisp the Language 第 3 章快结束时,Steele 写道“使用词法作用域的构造在每次执行时有效地为每个已建立的实体生成一个新名称。因此不会发生动态阴影(尽管可能会出现词法阴影)”。我对他所说的“动态阴影不会发生”的确切含义感到困惑。 “动态阴影”的示例是什么样的?
【问题讨论】:
标签: scope lisp common-lisp
在 Common Lisp the Language 第 3 章快结束时,Steele 写道“使用词法作用域的构造在每次执行时有效地为每个已建立的实体生成一个新名称。因此不会发生动态阴影(尽管可能会出现词法阴影)”。我对他所说的“动态阴影不会发生”的确切含义感到困惑。 “动态阴影”的示例是什么样的?
【问题讨论】:
标签: scope lisp common-lisp
这是他可能的意思的一个例子:
(defun f (g)
(let ((a 2))
(funcall g a)))
(let ((a 1))
(f (lambda (x) (- x a))))
这会在 Common Lisp 中返回 1,因为 a 在 f 中的词法绑定不会影响 a 在顶级 let 中的绑定,所以,当 f 调用 @987654329 @,它从2 中减去1,因为lambda 从顶级绑定中得到a。
将此与 Emacs Lisp 中的动态绑定进行对比,后者的返回值为 0。
您可能还会发现计算出 contorted-example 并在 CL 和 ELisp 中尝试它很有启发性。
【讨论】: