Let和Let*令人困惑的方案

use*_*501 4 scheme let

(let ((x 2) (y 3)
  (let ((x 7)
        (z (+ x y)))
    (* z x)))
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,为什么答案35,而不是70?在第二个let,x是7所以z应该是7 + 3 = 10,然后结果应该是7*10 = 70.我知道另一个是让*我在这之间非常混乱2.样本是谷歌的抓取.我已经google但是无法得到它.

Jon*_* O. 5

扩展Leppie的答案:如果你写过

(let ((x 2) (y 3))
    (let* ((x 7)
           (z (+ x y)))
       (* z x)))
Run Code Online (Sandbox Code Playgroud)

你会得到你期望的答案.内部let*完全等同于

(let ((x 7))
    (let ((z (+ x y)))
       (* z x)))
Run Code Online (Sandbox Code Playgroud)

实际上可能会在某些方案中以这种方式实施.

换句话说,在第一个let*之后的每个连续绑定的形式都在所有先前创建的绑定的范围内.