2015-09-14 58 views
6

在Clojure中,方括號是定義向量的縮寫:爲什麼`VECTOR`和`[...]`有時候行爲不同的Clojure?

user=> (vector 'a 'b 'c) 
[a b c] 
user=> ['a 'b 'c] 
[a b c] 

The documentation pagevector講的長方式和限定矢量的短路。

然而,在defndoseq似乎有差異。

user=> (doseq [x (range 1 4)] (printf "%d\n" x)) 
1 
2 
3 
nil 
user=> (doseq (vector 'x (range 1 4)) (printf "%d\n" x)) 
IllegalArgumentException doseq requires a vector for its binding in user:1 clojure.core/doseq (core.clj:2935) 

這個區別是什麼造成的?方括號在讀者中是否具有特殊的地位,或者它們是否加了一些特定的形式?

回答

9

vector被宏擴展後評估,而[]在讀時間計算,宏展開之前。在第二個情況下,doseq宏不會看到一個載體,它看到開始符號vector列表,因爲常規的功能進行評估之前宏進行擴展。

相關問題