“let”绑定不适用于后续的“let”绑定?

时间:2014-08-27 11:16:10

标签: emacs elisp

我学习了Emacs Lisp,因为我想自定义我的编辑器并且要清楚我对动态绑定的工作方式有点困惑。

以下是示例:

(setq y 2)    

(let ((y 1)
      (z y))
  (list y z))

  ==> (1 2)

结果我回来了=> (1 2) 请有人解释一下究竟发生了什么。我尝试使用框架的概念来解释它,每个框架创建本地绑定,但它似乎在这里以不同的方式工作。

为什么它不在最近的帧中取最接近的'y'值?

如果可以详细描述这里的情况,我会很高兴。

提前致谢。尼克。

4 个答案:

答案 0 :(得分:6)

在emacs lisp中(与许多lisps一样),将在let中绑定的值在环境"外部"中并行计算。 let

例如,以下是(大致)等效的:

(let ((a b)
      (b a))
  ...)

=>

(funcall (lambda (a b) ...) b a)

如果您想按顺序绑定内容,则应使用let*,这样做符合您的预期let

答案 1 :(得分:3)

您的示例似乎直接来自Emacs Lisp Reference。如果向下滚动到let*,您将获得解释:

  

这个特殊的形式就像let一样,但它紧跟着每个变量   在计算本地值之前计算其本地值   下一个变量。因此,绑定中的表达式可以参考   在此let *表单中绑定的前面符号。比较以下内容   以上示例的例子:let:

(setq y 2)
⇒ 2

(let* ((y 1)
       (z y))    ; Use the just-established value of y.
  (list y z))
⇒ (1 1)

答案 2 :(得分:2)

如果您使用允许您使用let*提到的变量的let,问题就解决了:

(setq y 2)    

(let* ((y 1)
       (z y))
  (list y z))

  ==> (1 1)

答案 3 :(得分:1)

你在let中设置的y的值仅在let的BODY中生效,当你在同一个let语句中设置z时,它还没有生效。