title: Why does using keywords or symbols as functions to lookup values from maps work?
body: <p>Quoting from <em>Joy of Clojure</em>, section 4.3.1--</p>
  
  <blockquote>
    <p>Because keywords are self-evaluating and provide fast equality checks, they're almost always used in the context of map keys. An equally important reason to use keywords as map keys is that they can be used as functions, taking a map as an argument, to perform value lookups:</p>
  </blockquote>
  
  <pre><code>(def population {:zombies 2700, :humans 9})
  (:zombies population)
  ;=&gt; 2700
  (println (/ (:zombies population)
  (:humans population))
  "zombies per capita")
  ; 300 zombies per capita
  </code></pre>
  
  <p>It is not apparent to me what is going on here. Somehow <code>(:zombies population)</code> has to get transformed into <code>(get population :zombies)</code>, right? How exactly does this work? The keyword evaluates to itself, not to a function. Does the reader look out for cases where the first thing in a list is a keyword, and add get and move the keyword to the end of the list?</p>