(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
上述代码求值为7,逻辑是b取值为a
。根据我的理解,在词汇绑定中,每个'let'的使用都会创建一个新的位置。那么为什么(b a)
声明中的变量b
未使用(a 4)
中的值a
?Lisp中的词法绑定
(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
上述代码求值为7,逻辑是b取值为a
。根据我的理解,在词汇绑定中,每个'let'的使用都会创建一个新的位置。那么为什么(b a)
声明中的变量b
未使用(a 4)
中的值a
?Lisp中的词法绑定
因为这就是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
(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
是第一主体。当评估b
的表达式时,a
是4
。
我们究竟是什么意思的词汇环境的名称?它是否涉及其范围? – Hubble 2014-12-07 16:21:50
@ hubble基本上,是的。词汇环境适用于所有实际用途,与词汇范围相同。动态环境依赖于执行时的精确调用路径。 – Vatine 2014-12-10 18:01:39