2015-09-14 15 views
6

In Clojure, le parentesi quadre sono una scorciatoia per i vettori che definiscono:Perché `vector` e` [...] `a volte si comportano in modo diverso in Clojure?

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

The documentation page per vector parla del lungo cammino e il breve modo di definire vettori.

Tuttavia, in defn e doseq sembra esserci una differenza.

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) 

Che cosa spiega questa differenza? Le parentesi quadre hanno uno status speciale nel lettore o hanno una forma particolare?

risposta

9

vector viene valutato dopo la macroespansione, mentre [] viene valutato in fase di lettura, prima che le macro vengano espanse. Nel secondo caso, la macro doseq non vede un vettore, vede una lista che inizia con il simbolo vector, poiché le macro vengono espanse prima di valutare le funzioni regolari.

Problemi correlati