【发布时间】:2014-10-31 09:29:22
【问题描述】:
根据 Learning Clojure wikibook 反引号扩展如下
`(x1 x2 x3 ... xn)
被解释为意味着
(clojure.core/seq (clojure.core/concat |x1| |x2| |x3| ... |xn|))
为什么用 seq 包裹 concat?有什么区别?
【问题讨论】:
根据 Learning Clojure wikibook 反引号扩展如下
`(x1 x2 x3 ... xn)
被解释为意味着
(clojure.core/seq (clojure.core/concat |x1| |x2| |x3| ... |xn|))
为什么用 seq 包裹 concat?有什么区别?
【问题讨论】:
不管它是如何产生的
concat 返回一个序列,并且 seq 返回一个与其序列参数内容相同的序列,...所以seq实际上是concat上的一个身份操作... 除了在一种情况下:
当s 为空序列时,(seq s) 为nil。
我怀疑扩展是正确的,因为
`()
... 计算结果为
()
... 有类型
clojure.lang.PersistentList$EmptyList
而
(seq (concat))
... 计算结果为
nil
这表明对seq 的包装调用不存在。
【讨论】:
RT.cons(LIST,null)。这可能会返回 null,但我们知道它不会。
(),因为它有一个例外。在所有其他情况下,seq 被包装。
严格来说,它扩展为:
(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。否则,我会在这里复制它。
【讨论】:
'`(x1 x2 x3) 的计算结果相同。