clojure list操作结果不相等

时间:2015-05-06 11:05:17

标签: clojure

我测试了一些列表操作,用两种语法找到了这个区别。

(conj (cons 321321 [1]) 123123123)
=> (123123123 321321 1)

(cons 321321 [1])
=> (321321 1)
(conj [321312 1] 123123123)
=> [321312 1 123123123]

为什么这些结果不相等?

1 个答案:

答案 0 :(得分:8)

因为你在做不同的事情。

cons http://clojuredocs.org/clojure.core/cons

  

返回一个新的seq,其中x是第一个元素,seq是     其余的。

conj http://clojuredocs.org/clojure.core/conj

  

返回带有xs的新集合     '添加&#39 ;. (conj nil item)返回(item)。 '添加'可以     发生在不同的地方'取决于具体类型。

在你的第一个例子中,你是" prepend"一个新的条目(将conj添加到序列的最简单方法),在你的第二个例子中,你是"追加"到一个向量(再加上conj最简单的方法)。

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