2015-09-14 11 views
6

W Clojure nawiasy kwadratowe są zapisem skrótowym do wektorów określających:Dlaczego "wektor" i "[...]" czasami zachowują się inaczej w Clojure?

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

The documentation page do vector mówi się o długą drogę i krótkiej drodze określania wektorów.

Jednak w defn i doseq wydaje się, że istnieje różnica.

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) 

Co odpowiada za tę różnicę? Czy nawiasy kwadratowe mają specjalny status w czytniku, czy też mają jakąś szczególną postać?

Odpowiedz

9

vector jest oceniany po makro ekspansji, a [] jest oceniany w czasie odczytu, zanim makra zostaną rozwinięte. W drugim przypadku makro doseq nie widzi wektora, widzi listę rozpoczynającą się od symbolu vector, ponieważ makra są rozwijane przed oceną zwykłych funkcji.

Powiązane problemy