我对方案功能有疑问:
> (let ((x 2) (y 3))
> (let ((x 7) (z (+ x y)))
> (* z x) ) )
结果是:35.有人可以解释我为什么吗? 我不明白的是,我们将x的值更改为7,我认为结果应该是70。
答案 0 :(得分:0)
实际上,Sylwester已经对此进行了解释。
; I like to write `let` forms in this way:
(let ((x 2)
(y 3))
(let ((x 7)
(z (+ x y))) ; since this is within a `let` definition part,
; and not in a `let*` definition part,
; the definition of z - which is (+ x y) -
; cannot "see" (x 7) yet,
; so it "searches" for x and "finds" it above
; in the let definition (x 2).
; therefore, (z (+ x y)) will be evaluated as
; (z (+ 2 3)) thus (z 5)
(* z x))) ; this now is in the inner-let body,
; thus it "sees" (x 7) which has "shadowed" (x 2)
; therefore this will be evaluated as (* 5 7), thus 35.
答案 1 :(得分:0)
let
形式的定义不能引用同一let
形式的早期绑定;在其周围环境中查找绑定。
因此,x
在2
中是(+ x y)
,在7
中是(* z x)
。
换句话说,
(let ((a e1) (b e2))
e3)
不等于
((lambda (a) ((lambda (b) e3) e2)) e1)
但是
((lambda (a b) e3) e1 e2)
如果使用let*
,您将获得预期的行为。