我是clojure的新手,最初我正在浏览Clojure.org和cheatbook。
我想知道conj
在列表和向量上的不同行为的确切原因。
(conj [1 2 3] 4)
[1 2 3 4]
(conj (list 3 2 1) 4)
(4 3 2 1)
当我在列表中使用它时,它会在第一个位置添加元素,并使用向量添加到最后位置。
答案 0 :(得分:22)
conj
程序根据具体类型在“不同'位置'添加新元素”。特别是,conj
在给定数据结构的最有效位置添加新元素。
在单链表中,插入新元素的最便宜位置在头部 - 没有必要遍历列表以找到插入点,只需将新元素与列表的第一个元素连接即可。
在向量中,最便宜的位置在最后 - 不需要移动或移动其余元素以为新元素腾出空间,并且如果向量是使用额外的可用空间创建的,实际大小大于它的当前长度(如瞬态向量和conj!
的情况,但不是持久向量),这是一个简单的问题,即在第一个空闲位置添加新元素并将其长度增加一个单位。