我是Clojure的新手,起初我正在经历Clojure.orgcheatbook

我想知道列表和向量上conj不同行为的确切原因是什么。

(conj [1 2 3] 4)
[1 2 3 4]

(conj (list 3 2 1) 4)
(4 3 2 1)

当我将其与列表一起使用时,它会在第一个位置添加元素,并与向量一起在最后一个位置添加元素。

最佳答案

conj 过程“根据具体类型在不同的“位置”添加新元素”。特别是,conj在给定数据结构的最有效位置添加了新元素。

在单链接列表中,最便宜的插入新元素的地方是头-无需遍历列表来找到插入点,只需将新元素与列表的第一个元素连接即可。

在向量中,最便宜的位置在末端-无需移动或移动其余元素来为新元素腾出空间,并且如果向量是使用额外的自由空间创建的,且其实际大小大于其当前长度(与 transient 矢量和conj!一样,但对于持久性矢量则不是),只需在第一个自由位置添加新元素并将其长度增加一个单位即可。

10-06 01:00