anchor.diff:  ;= Super Co. Philadelphia - The worldwide leader in plastic tableware.
   ----
   
  -The destructuring form is now a map rather than a vector, and instead of a symbol on the left side of the let, we have a map. The keys of the map are the symbols we want to bind in the let and the right side are the keys we will look up in the associative value.
  +The destructuring form is now a map rather than a vector, and instead of a symbol on the left side of the let, we have a map. The keys of the map are the symbols we want to bind in the let. The values of the destructuring map are the keys we will look up in the associative value. Here they are keywords (the most common case), but they could be any key value - numbers, strings, symbols, etc.
   
   Similar to sequential destructuring, if you try to bind a key that is not present in the map, the binding value will be nil. 
   
  
positive.code: 
  [source,clojure]
  ----
  (let [[first & remaining] names]
    (println first)
    (apply println remaining))
  ;= Michael
  ;= Amber Aaron Nick Earl Joe
  
negative.code: ----
  
  Creating and destructuring maps with auto-resolved keywords allow us to write code using a namespace alias (here `p`) that is defined by a `require` in the current namespace, giving us a means of namespace indirection that can be changed at a single place in the code.
  
  All symbols bound in the context of destructuring can be further destructured - this allows destructuring to be used in a nested fashion for both sequential and associative destructuring. It is less obvious, but this also extends to the symbol defined after `&`.
  
  This example destructures the `&` seq in place to decode the rest of the arguments as options (note that we are thus destructuring the two arguments sequentially and the rest associatively):
  
  [source,clojure]
  ----
  (defn f-with-options
    [a b & {:keys [opt1]}]
    (println "Got" a b opt1))
  
  (f-with-options 1 2 :opt1 true)
  ;= Got 1 2 true
  ----
  
  == Where to destructure
  
  