Почему использование ключевых слов или символов в качестве функций для поиска значений на картах работает?

Цитата из 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

Мне не очевидно, что здесь происходит. Каким-то образом (: популяция зомби) должно быть преобразовано в (получить популяцию: зомби) , верно? Как именно это работает? Ключевое слово оценивает само себя, а не функцию. Обращает ли читатель внимание на случаи, когда первым в списке является ключевое слово, и добавляет ли получить и переместить ключевое слово в конец списка?

21
задан Nathan Hughes 2 August 2011 в 16:50
поделиться

1 ответ

Цитирование из официальной документации :

Ключевые слова реализуют IFn для invoke () одного аргумента (карты) с необязательным вторым аргументом (значением по умолчанию). Например, (: mykey my-hash-map: none) означает то же самое, что и (получить my-hash-map: mykey: none). Смотрите, получите.

И Clojure может вызывать ключевое слово как функцию, потому что он реализует тот же интерфейс, что и функция. То же касается символов ...

24
ответ дан 29 November 2019 в 20:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: