Ось документація Clojure для ключових слів та символів.
Ключові слова - це символьні ідентифікатори, які оцінюють самі. Вони забезпечують дуже швидкі тести на рівність ...
Символи - це ідентифікатори, які зазвичай використовуються для позначення чогось іншого. Вони можуть бути використані у програмних формах для позначення параметрів функції, прив’язки, назв класів та глобальних змін ...
Ключові слова зазвичай використовуються як легкі "постійні рядки", наприклад, для ключів хеш-карти або значень диспетчера мультиметоду. Символи зазвичай використовуються для назви змінних та функцій, і рідше маніпулювати ними як об'єктами безпосередньо, за винятком макросів і подібних. Але ніщо не заважає вам використовувати символ скрізь, коли ви використовуєте ключове слово (якщо ви не заперечуєте їх постійно цитувати).
Найпростіший спосіб побачити різницю - це читати Keyword.java
та Symbol.java
в джерелі Clojure. Є декілька очевидних відмінностей в реалізації. Наприклад, символ у Clojure може мати метадані, а ключове слово не може.
Окрім синтаксису з однократною двокрапкою, ви можете використовувати подвійну двокрапку, щоб створити ключове слово, призначене для простору імен.
user> :foo
:foo
user> ::foo
:user/foo
У звичайного Lisp є ключові слова, як у Ruby та інших мов. Вони, звичайно, трохи відрізняються в цих мовах. Деякі відмінності між загальними ключовими словами Lisp та ключовими словами Clojure:
Ключові слова в Clojure - це не символи.
user> (symbol? :foo)
false
Ключові слова не належать до жодного простору імен, якщо ви спеціально не кваліфікуєте їх:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Дякую Райнеру Джосвігу, що дав мені уявлення про речі, на які слід подивитися.)