2014-08-27 73 views
1

我学习了Emacs Lisp,因为我想定制我的编辑器并且很清楚我对动态绑定的工作原理有点困惑。“let”绑定不适用于后续的“let”绑定?

这里是例子:

(setq y 2)  

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

    ==> (1 2) 

结果我回来=>(1 2) 请一些能解释一个究竟怎么回事。我试图用自己的框架来解释这个框架,其中每个框架创建本地绑定,但它看起来像在这里以不同的方式工作。

为什么它没有在最近的框架中取最接近的'y'值?

如果能够详细描述这里发生了什么,我会非常高兴。

在此先感谢。缺口。

+0

我编辑的问题标题。这与动态绑定没有任何特别的关系。 – Drew 2014-08-27 15:34:47

回答

6

在的Emacs Lisp(如在许多的Lisp),将在let绑定的值计算并行地,在“外部”环境中的let

作为一个例子,下面是(约)相当于:

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

=> 

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

如果你要绑定顺序的事情,你应该使用let*,这不符合您的预期let做。

+0

尼斯细微的答案。 – 2014-08-27 13:13:55

1

您设置的y的值只允许在let的body中生效,但当您在同一个let语句中设置z时,该值尚未生效。

2

如果使用let*它允许你使用let -mentioned瓦尔的问题就解决了:

(setq y 2)  

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

    ==> (1 1) 
3

你的例子似乎是直接从Emacs Lisp Reference。如果您向下滚动到let*,你会得到的解释:

这种特殊的形式是像让,但它 计算它的局部值后,结合每个变量正确,计算当地的价值,为 下一个变量之前。因此,绑定中的表达式可以引用在此let *形式中绑定的前面的符号。以上为让例子比较下面 例如:

(setq y 2) 
⇒ 2 

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

是的,我做过了,我的意思是从Emacs Lisp Reference作为最直接的一个。 – SuperManEver 2014-08-27 12:23:23

相关问题