Цитата из Joy of Clojure , раздел 4.3.1 -
Поскольку ключевые слова являются самооценочными и обеспечивают быструю проверку равенства, они почти всегда используются в контекст ключей карты. Не менее важной причиной использования ключевых слов в качестве ключей карты является то, что они могут использоваться как функции, принимая карту в качестве аргумента, для выполнения поиска значений:
(def population {:zombies 2700, :humans 9})
(:zombies population)
;=> 2700
(println (/ (:zombies population)
(:humans population))
"zombies per capita")
; 300 zombies per capita
Мне не очевидно, что здесь происходит. Каким-то образом (: популяция зомби)
должно быть преобразовано в (получить популяцию: зомби)
, верно? Как именно это работает? Ключевое слово оценивает само себя, а не функцию. Обращает ли читатель внимание на случаи, когда первым в списке является ключевое слово, и добавляет ли получить и переместить ключевое слово в конец списка?
Цитирование из официальной документации :
Ключевые слова реализуют IFn для invoke () одного аргумента (карты) с необязательным вторым аргументом (значением по умолчанию). Например, (: mykey my-hash-map: none) означает то же самое, что и (получить my-hash-map: mykey: none). Смотрите, получите.
И Clojure может вызывать ключевое слово как функцию, потому что он реализует тот же интерфейс, что и функция. То же касается символов ...