2014-12-07 54 views
1
(let ((a 3)) 
    (let ((a 4) 
     (b a)) 
    (+ a b))) 

上述代碼求值爲7,邏輯是b取值爲a。根據我的理解,在詞彙綁定中,每個'let'的使用都會創建一個新的位置。那麼爲什麼(b a)聲明中的變量b未使用(a 4)中的值aLisp中的詞法綁定

回答

5

因爲這就是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 

請參閱Special Operator LET, LET*

+0

我們究竟是什麼意思的詞彙環境的名稱?它是否涉及其範圍? – Hubble 2014-12-07 16:21:50

+0

@ hubble基本上,是的。詞彙環境適用於所有實際用途,與詞彙範圍相同。動態環境依賴於執行時的精確調用路徑。 – Vatine 2014-12-10 18:01:39

0
(let ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 7 

等價於寫作:

((lambda (a b) 
    (+ a b)) 
4 
a) ; ==> 7 

你從這個版本,它的邏輯,ab4a評價後必然看到了什麼?

現在我們有:

(let* ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 8 

這相當於:

(let ((a 4)) 
    (let ((b a)) 
    (+ a b))) ; ==> 8 

這裏第二let是第一主體。當評估b的表達式時,a4