2011-11-07 33 views
4
(let ((x 2) (y 3) 
    (let ((x 7) 
     (z (+ x y))) 
    (* z x))) 

通過上面的代碼,爲什麼答案是35,不是70?在第二個let中,x是7,所以z應該是7 + 3 = 10,然後結果應該是7 * 10 = 70.我知道得到另一個就是讓*這個2之間的混淆。谷歌。我已經谷歌,但不能得到它。方案混淆放開和讓·

回答

2

x在呼叫(+ x y)時仍然綁定到外部let

5

要擴大Leppie的回答是:如果你寫了

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

,你會得到你需要的答案。內部let*是完全等同於

(let ((x 7)) 
    (let ((z (+ x y))) 
     (* z x))) 

,實際上可以被實施在一些方案中的方式。

換句話說,在一個let*窗體中的每個連續綁定之後,第一個位於所有先前創建的綁定的範圍內。