2015-09-14 10 views
6

、角括弧は、ベクトルを定義するための速記である:vectorためClojureで `vector`と` [...] `の動作が異なるのはなぜですか? Clojureので

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

The documentation pageは長い道のりとのベクトルを定義する短い方法を話します。

ただし、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は、マクロ展開後に評価されます。 2番目のケースでは、doseqマクロはベクトルを表示しません。通常の関数が評価される前にマクロが展開されているため、シンボルvectorで始まるリストが表示されます。

関連する問題