2015-04-06 66 views
3

我現在在閱讀「Common Lisp:象徵性計算的簡單介紹」。什麼情況下需要讓,而不是讓*?

第5章介紹letlet*並討論它們之間的區別,並特別指出,你可能會誤以爲總是使用let*代替let,但你不應該有兩個原因這樣做:

  1. let更容易理解,因爲它意味着沒有依賴關係。
  2. 5.6節說有些情況下let是唯一正確的選擇,但它沒有詳細說明。

其實,它說:

有一些情況下是LET的唯一正確的選擇,但我們不會詳談這裏。在風格上,在可能的情況下最好使用LET而不是LET *,因爲這表示任何讀取程序的人都會在正在創建的局部變量之間沒有依賴關係。具有較少依賴性的程序更易於理解。

所以,現在我的問題是:這些情況下let是唯一正確的選擇是什麼?

+1

還有一些關於'let'很像'lambda'的好處,但'let *'表現得像一堆嵌套lambdas,或者一堆嵌套的let。 –

回答

5

它主要是關於你想參考哪個變量。

(let ((p 'foo)) 
    (let or let* ; use of those 
     ((p 'bar) 
     (q p))  ; which p do you want? The first or the second? 
    (list p q))) 

試試:

CL-USER 60 > (let ((p 'foo)) 
       (let ((p 'bar) 
        (q p)) 
       (list p q))) 
(BAR FOO) 

CL-USER 61 > (let ((p 'foo)) 
       (let* ((p 'bar) 
         (q p)) 
       (list p q))) 
(BAR BAR) 

注意還存在是LET間接依賴:對於綁定的值進行評估從左到右:

(let ((list '(1 2))) 
    (let ((a (pop list)) 
     (b (pop list))) 
    (list a b))) 

的上述結果表格將始終爲(1 2)

+0

非常感謝:-))。我發現[this](http://stackoverflow.com/questions/554949/let-versus-let-in-common-lisp)也很有幫助。 –

相關問題