Clojure 有人能解释一下”的行为吗;conj";?

Clojure 有人能解释一下”的行为吗;conj";?,clojure,Clojure,返回(\e\a\b\c\d) 我很困惑。在conj的文档中,我注意到 根据混凝土类型,“添加”可能发生在不同的“位置” 这是否意味着对于LazySeq,添加新项目的位置是头部? 如何获得(\a\b\c\d\e)作为结果 “添加”可能发生在不同的“位置”,具体取决于 混凝土类型 这是指Clojure的持久性集合的行为,这些集合以最有效的方式结合了性能和底层实现方面的添加 向量始终添加到集合的末尾: (conj (drop-last "abcde") (last "abcde")) 对于列表,co

返回
(\e\a\b\c\d)

我很困惑。在
conj
的文档中,我注意到

根据混凝土类型,“添加”可能发生在不同的“位置”

这是否意味着对于
LazySeq
,添加新项目的位置是头部? 如何获得
(\a\b\c\d\e)
作为结果

“添加”可能发生在不同的“位置”,具体取决于 混凝土类型

这是指Clojure的持久性集合的行为,这些集合以最有效的方式结合了性能和底层实现方面的添加

向量始终添加到集合的末尾:

(conj (drop-last "abcde") (last "abcde"))
对于列表,conj将项目放在列表的前面,正如您所注意到的:

user=> (conj [1 2 3] 4)
[1 2 3 4]
因此,是的,就其具体实现而言,LazySeq被视为一个列表

如何获得
(\a\b\c\d\e)
作为结果

有很多种方法,但您可以轻松地从LazySeq创建一个向量:

user=> (conj '(1 2 3) 4)
(4 1 2 3)

重要的是要认识到,
conj
只是在Clojure的Java stuff中的
IPersistentCollection
接口上委托
cons
的实现。因此,根据所处理的给定数据结构,它的行为可能会有所不同

conj背后的意图是,它总是以最有效的方式向数据结构中添加项

对于列表来说,最有效的位置是前面。对于矢量,最有效的放置点是在末端。

可能的重复:
(conj (vec (drop-last "abcde"))
      (last "abcde"))