2014-12-07 46 views
1
(let ((a 3)) 
    (let ((a 4) 
     (b a)) 
    (+ a b))) 

上述代码求值为7,逻辑是b取值为a。根据我的理解,在词汇绑定中,每个'let'的使用都会创建一个新的位置。那么为什么(b a)声明中的变量b未使用(a 4)中的值aLisp中的词法绑定

回答

5

因为这就是LET指定要做的事情。绑定在并行完成。

CL-USER 60 > (let ((a 3)) 
       (let ((a 4) 
        (b a)) 
       (+ a b))) 
7 

版本,其中绑定在顺序方式进行的被称为LET*

CL-USER 61 > (let ((a 3)) 
       (let* ((a 4) 
         (b a)) 
       (+ a b))) 
8 

请参阅Special Operator LET, LET*

+0

我们究竟是什么意思的词汇环境的名称?它是否涉及其范围? – Hubble 2014-12-07 16:21:50

+0

@ hubble基本上,是的。词汇环境适用于所有实际用途,与词汇范围相同。动态环境依赖于执行时的精确调用路径。 – Vatine 2014-12-10 18:01:39

0
(let ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 7 

等价于写作:

((lambda (a b) 
    (+ a b)) 
4 
a) ; ==> 7 

你从这个版本,它的逻辑,ab4a评价后必然看到了什么?

现在我们有:

(let* ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 8 

这相当于:

(let ((a 4)) 
    (let ((b a)) 
    (+ a b))) ; ==> 8 

这里第二let是第一主体。当评估b的表达式时,a4