Вот документация Clojure по ключевым словам и символам.
Ключевые слова - это символьные идентификаторы, которые оцениваются сами по себе. Они предоставляют очень быстрые тесты на равенство ...
Символы - это идентификаторы, которые обычно используются для обозначения чего-то еще. Их можно использовать в формах программ для обращения к параметрам функций, привязкам let, именам классов и глобальным переменным ...
Ключевые слова обычно используются как легкие «постоянные строки», например, для ключей хэш-карты или значений диспетчеризации мультиметода. Символы обычно используются для именования переменных и функций, и реже манипулируют ими как объектами напрямую, за исключением макросов и т.п. Но ничто не мешает вам использовать символ везде, где вы используете ключевое слово (если вы не против постоянно их цитировать).
Самый простой способ , чтобы увидеть разницу, чтобы прочитать Keyword.java
и Symbol.java
в источнике Clojure. Есть несколько очевидных различий в реализации. Например, у символа в Clojure могут быть метаданные, а у ключевого слова - нет.
Помимо синтаксиса с одним двоеточием, вы можете использовать двойное двоеточие для создания ключевого слова с указанием пространства имен.
user> :foo
:foo
user> ::foo
:user/foo
В Common Lisp есть ключевые слова, как в Ruby и других языках. Конечно, на этих языках они немного отличаются. Некоторые различия между ключевыми словами Common Lisp и Clojure:
Ключевые слова в Clojure не являются символами.
user> (symbol? :foo)
false
Ключевые слова не принадлежат ни к какому пространству имен, если вы специально не указали их:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Спасибо Райнеру Йосвигу за то, что он дал мне идеи, на что можно посмотреть.)