Clojure: почему (в {} '((1 2) (3 4))) не получается?

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

Почему тогда

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

не удается, а

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

преуспевает?

7 голосов | спросил Marcus Junius Brutus 23 J0000006Europe/Moscow 2013, 01:12:38

1 ответ


0

Это артефакт реализации карт.

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

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

(conj {} [:a 1])
=> {:a 1}
ответил mikera 23 J0000006Europe/Moscow 2013, 01:32:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132