2013-06-22 3 views
7

Я понял, что списки и векторы Clojure в основном взаимозаменяемы, и использование одного или другого связано с такими вещами, как порядок вставки в conj или отсутствие необходимости цитировать в случае векторов.Clojure: почему (в {} '((1 2) (3 4))) терпит неудачу?

Почему тогда

(into {} '((1 2) (3 4))) 

неудачу, в то время как

(into {} '([1 2] [3 4])) 

успешно?

+0

@ H2CO3 - оба вектора и списки неизменны в Clojure – mikera

ответ

6

Это артефакт о том, как реализуются карты.

Карты концептуально рассматриваются как последовательности из java.util.Map.Entry элементов по многим функциям Clojure. Бывает, что в APersistentMap.java есть специальный код кода для обработки векторов длины 2 в качестве записи карты (в APersistentMap.cons), но не для списков.

Возможно, существует разумный случай для предоставления векторам этой специальной обработки, поскольку они являются удобной формой для представления литературных букв в коде. Таким образом, вы можете написать следующее:

(conj {} [:a 1]) 
=> {:a 1}