Clojure:
1:13 user=> (first (conj '(1 2 3) 4))
4
1:14 user=> (first (conj [1 2 3] 4))
1
; . . .
1:17 user=> (first (conj (seq [1 2 3]) 4))
4
我了解发生了什么,但这应该以不同的方式工作吗?
最佳答案
conj
的文档(来自 clojure.org ):
conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type.
将元素“添加”到向量的末尾更有效,而在列表的开头这样做更有效。
conj
使用对您提供的数据结构最有效的任何东西。在您给出的示例中,
'(1 2 3)
和 (seq [1 2 3])
都实现ISeq
(见 documentation for seq?
),而 [1 2 3]
没有。Clojure 的
conj
最终调用cons
底层数据结构上的方法(不要与 cons
函数混淆 - 此方法是内部 clojure 代码);对于向量(PersistentVector
),cons
将元素添加到末尾,而对于列表,它们被添加到前面(cons
s 的 PersistentList
方法返回一个新列表,其中新元素作为其头部,现有列表作为其尾部)。
关于clojure - 与 Clojure 的序列不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437833/