【问题标题】:Common Lisp the Language: "dynamic shadowing cannot occur"Common Lisp 语言:“动态阴影不会发生”
【发布时间】:2014-11-14 15:10:59
【问题描述】:

在 Common Lisp the Language 第 3 章快结束时,Steele 写道“使用词法作用域的构造在每次执行时有效地为每个已建立的实体生成一个新名称。因此不会发生动态阴影(尽管可能会出现词法阴影)”。我对他所说的“动态阴影不会发生”的确切含义感到困惑。 “动态阴影”的示例是什么样的?

【问题讨论】:

    标签: scope lisp common-lisp


    【解决方案1】:

    这是他可能的意思的一个例子:

    (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 中尝试它很有启发性。

    【讨论】:

    • 我不太确定。您正在演示如何无法动态隐藏具有词法范围的变量。他可能会这么说,但他无条件地说“不会发生动态阴影”。
    • 他说奇完美数不存在。我解释什么是完美数并演示一个偶数。您现在要求我提供一个奇完美数作为示例。我很困惑。 :-)
    • @malisp 我也将其读作“动态阴影 [词法范围的构造] 不会发生”。
    • @sds Steele 说“动态阴影不会发生”并不等同于他说奇数不存在,更像是他说完美数不存在。斯蒂尔给出的解释 m-n 隐含地指代动态范围的子集(相当于隐含地指代奇完美数)是一种可能性。所以我问斯蒂尔说“动态阴影”是什么意思。我认为 m-n 说的可能是对的,但对我来说似乎不太可能。
    • @mailsper “动态阴影”只能在声明为“特殊”的变量中发生(也就是说,它们是动态范围的,因此使用调用堆栈上靠近评估站点的绑定)。所以对于词法变量,动态阴影不能发生。
    猜你喜欢
    • 2023-03-23
    • 2020-09-11
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多