Lisp中的词法绑定

时间:2014-12-07 16:01:21

标签: common-lisp

(let ((a 3))
  (let ((a 4)
        (b a))
    (+ a b))) 

上面的代码评估逻辑是b取外a的值。根据我的理解,在词汇绑定中,每次使用'let'都会创建一个新的位置。那么为什么声明b中的变量(b a)没有使用a(a 4)的值?

2 个答案:

答案 0 :(得分:5)

因为LET指定要执行的操作。绑定在 parallel 中完成。

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*

答案 1 :(得分:0)

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

相当于写作:

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

从这个版本中可以看出,ab评估后4a的约束是否合乎逻辑?

现在我们有:

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

相当于:

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

这里第二个let位于第一个a的正文中。 <{1}}在评估4的表达式时为b