计划功能

时间:2018-10-08 17:35:53

标签: algorithm scheme

我对方案功能有疑问:

> (let ((x 2) (y 3))
>         (let ((x 7) (z (+ x y)))
>               (* z x) ) )

结果是:35.有人可以解释我为什么吗? 我不明白的是,我们将x的值更改为7,我认为结果应该是70。

2 个答案:

答案 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形式的早期绑定;在其周围环境中查找绑定。
因此,x2中是(+ 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*,您将获得预期的行为。