2015-10-04 2 views
3

Можете ли вы объяснить это поведение в Clojure?в список против вектора в Clojure

user=> (into [1 2 3] ["a" "b"]) 
[1 2 3 "a" "b"] 

но

user=> (into '(1 2 3) ["a" "b"]) 
("b" "a" 1 2 3) 

Вполне понятно, что into с вектором дописывает элементы, но почему использование into со списком первый заказ возвращается элементы, а затем присоединяет его к списку?

ответ

7

into использует conj, чтобы добавить элементы в коллекцию источников. conj присоединяет элементы к фронту для списков и до конца для векторов. Списки Clojure являются неизменяемыми односвязными списками, поэтому добавление в конец списка будет выполнять операцию O (n). Вставка спереди - операция с постоянным временем.

Смежные вопросы