Разница в поведении сопряжения на векторах и списках в Clojure

Я новичок в clojure, изначально я просматриваю Clojure.org и cheatbook.

Я хочу знать, что является точной причиной для различного поведения conj в списке и векторе.

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

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

когда я использую его со списком, он добавляет элемент в первое место и с вектором, который он добавляет в последнем месте.

Ответ 1

Процедура conj добавляет новые элементы "в разных местах" в зависимости от конкретного типа". В частности, conj добавляет новые элементы в наиболее эффективное место для данной структуры данных.

В односвязном списке самое дешевое место для вставки нового элемента во главе - нет необходимости перемещаться по списку, чтобы найти точку вставки, просто подключите новый элемент к первому элементу списка.

В векторе самое дешевое место в конце - нет необходимости сдвигать или перемещать остальные элементы, чтобы освободить место для нового элемента, и если вектор был создан с дополнительным свободным пространством с фактическим размером больше, чем его текущую длину (как в случае переходных векторов и conj!, но не с постоянными векторами), это простой вопрос о добавлении нового элемента в первое свободное положение и приращение его длины на единицу.