根据学习Clojure wikibook反引号扩展如下
`(x1 x2 x3 ... xn)
被解释为
(clojure.core/seq (clojure.core/concat |x1| |x2| |x3| ... |xn|))
为什么用seq包装concat?它有什么不同?
答案 0 :(得分:1)
无论它是如何产生的
concat
返回一个序列,seq
返回与其序列参数 ...所以seq
实际上是concat
... 上的身份操作,除非在一种情况下:
当s
为空序列时,(seq s)
为nil
。
我怀疑扩展是否正确,因为
`()
...评估为
()
...类型
clojure.lang.PersistentList$EmptyList
尽管
(seq (concat))
...评估为
nil
这表明对seq
的包装调用不存在。
答案 1 :(得分:-1)
严格地说,它扩展到:
(macroexpand '`(x1 x2 x3))
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/x1)) (clojure.core/list (quote user/x2)) (clojure.core/list (quote user/x3))))
(macroexpand `(x1 x2 x3))
(user/x1 user/x2 user/x3)
为什么拨打电话seq
?因为序列是Clojure哲学中的基石。我建议你阅读Clojure Sequences。否则,我会在这里复制它。