Вектор в Clojure расплывчато означает «это данные».Группа привязок для let
или fn
- это просто данные.Это последовательность символов или последовательность пар символ-значение.
Список неопределенно означает «Это вызов функции или макроса».Когда вы видите список, вы будете в полной безопасности, если предположить, что первым в этом списке есть что-то вызываемое, а остальное в списке - аргументы к нему.
Существуют исключения.Вы увидите и (ns foo (:use (bar baz)))
и (ns foo [:use [bar baz]])
в идиоматическом коде.Не уверен, почему кроме этого Clojure рос очень быстро и полуорганически в некоторых областях и все еще растет.Но это хорошее эмпирическое правило.
Векторы не нужно заключать в кавычки, что является хорошим способом избежать определенных ошибок, особенно если учесть, что многие вещи в Clojure могут вызываться как функции.(:foo :bar)
не является списком из двух ключевых слов, но он будет скомпилирован, вызывая :foo
в качестве поиска по ключевому слову для ключевого слова :bar
, оцениваемого как nil
.Там нет никакого способа испортить [:foo :bar]
.Это всегда вектор из двух ключевых слов.
Преимущество отсутствия необходимости заключать в кавычки элементы вектора не следует преуменьшать.Как бы вы хотели написать это списками?
(let [x 123 y 456]
[[:foo x] [:bar y]])
Один из способов настолько многословен, что ваши данные теряются в лесу list
.Другой способ - это ненужный беспорядок в пунктуации.
(let [x 123 y 456]
(list (list :foo x) (list :bar y)))
(let [x 123 y 456]
`((:foo ~x) (:bar ~y)))
Clojure, возможно, меньше, чем суп из скобок, чем другие диалекты Lisp, благодаря []
и {}
.Хотя некоторые люди не любят ))])})
, которое имеет Clojure, я думаю, что лучше потерять себя в длинной строке ))))))))
.
«Код - это данные» не означает, что все ваши данныедолжен выглядеть как весь ваш код и наоборот.У вас есть доступ к коду как данным, когда он вам нужен, что редко, как правило, в макросах.Между тем, если ваши данные не являются кодом, почему они должны выглядеть как код?Последовательность телефонных номеров не является кодом.Нет причин, по которым он должен быть в списке.
И, как вы сказали, со списками есть проблемы с производительностью.