2013-04-10 64 views
1

我正在通過Joy of Clojure中的解構示例進行工作,並且我通過一個令我感到驚訝的示例拍攝。這兩個產生相同的輸出:從右到左的裝訂順序

(let [range-vec (vec (range 10)) [a b c & more :as all] range-vec] 
     (println "a b c: " a b c) 
     (println "more: " more) 
     (println "all: " all)) 

(let [range-vec (vec (range 10))] 
    (let [[a b c & more :as all] range-vec] 
     (println "a b c: " a b c) 
     (println "more: " more) 
     (println "all: " all))) 

現在開始的第一種形式反駁我的直覺,因爲,以爲約束力和優先從左至右發生,該範圍-VEC不會被分配給「所有」之前定義。我是第二種形式,range-vec已經被定義,然後在第二個let語句中被分配給所有人,這似乎遵循我迄今所知的規則。我什麼時候知道符號何時被綁定以及發生的順序?

回答

3

按照Clojure documentation

的綁定是連續的,所以每個結合可以看到現有綁定。

你是Lisp或Scheme程序員嗎?在這方面,Clojure let就像CL或Scheme中的let*

+0

我是新來的lisps,所以我不是帶'let *'的家庭。所以綁定從左到右,而不是從左到右? – 2013-04-10 20:39:10

+1

是的,綁定從左到右。所以你的兩個版本是相同的。 – Barmar 2013-04-10 20:40:31

+0

謝謝,明白了! – 2013-04-10 20:49:27

相關問題