Clojure反击扩张

时间:2014-10-31 09:29:22

标签: macros clojure backticks

根据学习Clojure wikibook反引号扩展如下

`(x1 x2 x3 ... xn)

被解释为

(clojure.core/seq (clojure.core/concat |x1| |x2| |x3| ... |xn|))

为什么用seq包装concat?它有什么不同?

2 个答案:

答案 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。否则,我会在这里复制它。