为什么`vector`和`[...]`有时在Clojure中表现不同?

Ray*_*oal 6 syntax vector clojure syntactic-sugar

在Clojure中,方括号是定义向量的简写:

user=> (vector 'a 'b 'c)
[a b c]
user=> ['a 'b 'c]
[a b c]
Run Code Online (Sandbox Code Playgroud)

该文档页面vector讲的很长的路要走,并确定载体的一小段路.

然而,在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)
Run Code Online (Sandbox Code Playgroud)

这种差异的原因是什么?方括号在读者中是否具有特殊地位,或者它们是否具有特定的形式?

noi*_*ith 9

vector[]在宏扩展之后评估,同时在扩展宏之前在读取时评估.在第二种情况下,doseq宏看不到向量,它会看到以符号开头的列表vector,因为在评估常规函数之前会扩展宏.