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
Run Code Online (Sandbox Code Playgroud)
我理解发生了什么,但这应该有所不同吗?
Ger*_*ert 20
conj(来自clojure.org)的文档:
缀[OIN].返回xs'已添加'的新集合.(conj nil item)返回(item)."添加"可能发生在不同的"地方",具体取决于具体类型.
将元素"添加"到向量的末尾更有效,而在列表的开头更有效.conj使用对您提供的数据结构最有效的方法.
在这些例子中你给,'(1 2 3)并(seq [1 2 3])都实现ISeq(见的文档seq?),而[1 2 3]不会.
Clojure conj最终在底层数据结构上调用cons方法(不要与cons函数混淆- 这个方法是内部的clojure代码); 对于vectors(PersistentVector),cons将元素添加到结尾,而对于列表,它们被添加到前面(s 的cons方法PersistentList返回一个新列表,其中新元素作为其头部,现有列表作为其尾部).
你会看到,conj与列表和向量的工作方式不同.
conj将添加的项放在列表的前面和向量的末尾.
我还建议看看Clojure API conj
这有一些很好的例子.对于大多数Clojure命令,ClojureDocs总体上有一些很好的例子.