Ключевые слова являются функциями, во всех отношениях. Магия читателя не задействована, как вы увидите, если вы попробуете (let [m {:humans 100}, k :humans] (k m))
. Я надеюсь, вы согласитесь, что читатель никак не сможет превратить это в get (компилятор может, но вы можете притвориться, что я сделал значение k
зависимым от выражения if, которое компилятор не может предсказать, например, пользовательский ввод).
Поскольку основные типы данных Clojure являются интерфейсами, а объекты Java могут реализовывать множество интерфейсов, часть данных может иметь несколько типов. Это ключевое слово? Да. Это функция? Также да:
user> (keyword? :k)
true
user> (ifn? :k)
true
user> (.invoke :k {:k 1})
1