(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
上面的代码评估逻辑是b取外a
的值。根据我的理解,在词汇绑定中,每次使用'let'都会创建一个新的位置。那么为什么声明b
中的变量(b a)
没有使用a
中(a 4)
的值?
答案 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
答案 1 :(得分:0)
(let ((a 4)
(b a))
(+ a b)) ; ==> 7
相当于写作:
((lambda (a b)
(+ a b))
4
a) ; ==> 7
从这个版本中可以看出,a
和b
评估后4
和a
的约束是否合乎逻辑?
现在我们有:
(let* ((a 4)
(b a))
(+ a b)) ; ==> 8
相当于:
(let ((a 4))
(let ((b a))
(+ a b))) ; ==> 8
这里第二个let
位于第一个a
的正文中。 <{1}}在评估4
的表达式时为b
。