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"))