Цитата из Радости 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
Мне не кажется, что здесь происходит. Как-то (:zombies population)
нужно преобразовать в (get population :zombies)
, правильно? Как именно это работает? Ключевое слово оценивает себя, а не функцию. Читает ли читатель случаи, когда первое, что входит в список, является ключевым словом и добавляет get и перемещает ключевое слово в конец списка?