我测试了一些列表操作,用两种语法找到了这个区别。
(conj (cons 321321 [1]) 123123123)
=> (123123123 321321 1)
和
(cons 321321 [1])
=> (321321 1)
(conj [321312 1] 123123123)
=> [321312 1 123123123]
为什么这些结果不相等?
答案 0 :(得分:8)
因为你在做不同的事情。
cons
http://clojuredocs.org/clojure.core/cons
返回一个新的seq,其中x是第一个元素,seq是 其余的。
conj
http://clojuredocs.org/clojure.core/conj
在你的第一个例子中,你是" prepend"一个新的条目(将conj添加到序列的最简单方法),在你的第二个例子中,你是"追加"到一个向量(再加上conj最简单的方法)。返回带有xs的新集合 '添加&#39 ;. (conj nil item)返回(item)。 '添加'可以 发生在不同的地方'取决于具体类型。
user=> (.getClass (cons 321321 [1]))
clojure.lang.Cons
user=> (.getClass (conj (cons 321321 [1]) 123123123))
clojure.lang.Cons
注意您下次使用[...]
!
user=> (.getClass [321312 1])
clojure.lang.PersistentVector
user=> (.getClass (conj [321312 1] 123123123))
clojure.lang.PersistentVector