Citando alegría de Clojure, sección 4.3.1--¿Por qué usar palabras clave o símbolos como funciones para buscar valores desde mapas funciona?
Debido a que las palabras clave son la auto-evaluación y proporcionan controles de igualdad rápidas, son casi siempre se utiliza en el contexto de las claves de mapas. Una razón igualmente importante utilizar palabras clave como claves mapa es que pueden ser utilizados como funciones, teniendo un mapa como argumento, para realizar búsquedas de valor:
(def population {:zombies 2700, :humans 9})
(:zombies population)
;=> 2700
(println (/ (:zombies population)
(:humans population))
"zombies per capita")
; 300 zombies per capita
No es evidente para mí lo que está pasando aquí. De alguna manera (:zombies population)
tiene que transformarse en (get population :zombies)
, ¿verdad? ¿Cómo funciona esto exactamente? La palabra clave se evalúa a sí misma, no a una función. ¿Busca el lector los casos en que lo primero de una lista es una palabra clave y agrega obtener y mover la palabra clave al final de la lista?
Curiosamente, el primer argumento no tiene que ser un mapa: (: foo: bar: Baz) se obtiene: Baz – KingCode
@KingCode Si no es un 'ILookup', un' java Mapa ', o un' IPersistentSet', a continuación, '' getFrom' en RT' simplemente devuelve 'null', en cuyo caso el método' invoke' en 'Keyword' simplemente devuelve el valor' notFound', o ': baz' en su ejemplo . – Josh