I would really like to see more information regarding syntax-quote, especially the behind-the-scenes expansion algorithm as documented here:
In particular, I feel this info could be very useful in the book:
If a symbol is non-namespace-qualified and ends with ‘#’, it is resolved to a generated symbol with the same name to which ‘_’ and a unique id have been appended. e.g. x# will resolve to x_123. All references to that symbol within a syntax-quoted expression resolve to the same generated symbol.
For all forms other than Symbols, Lists, Vectors and Maps, `x is the same as ‘x.
Syntax-quotes can be nested within other syntax-quotes:
(moose ~(squirrel (whale ~zebra)))
For Lists syntax-quote establishes a template of the corresponding data structure. Within the template, unqualified forms behave as if recursively syntax-quoted.
`(x1 x2 x3 … xn)
is interpreted to mean(clojure.core/concat x1 x2 x3 … xn ) where the are used to indicate a transformation of an xj as follows:
* |form| is interpreted as (clojure.core/list `form), which contains a syntax-quoted form that must then be further interpreted. * |~form| is interpreted as (clojure.core/list form). * |~@form| is interpreted as form.
If the syntax-quote syntax is nested, the innermost syntax-quoted form is expanded first. This means that if several ~ occur in a row, the leftmost one belongs to the innermost syntax-quote.
Following the rules above, and assuming that the var a contains 5, an expression such as
would be expanded (behind the curtains) as follows:
(clojure.core/concat (clojure.core/list (quote clojure.core/concat)) (clojure.core/list (clojure.core/concat (clojure.core/list (quote clojure.core/list)) (clojure.core/list a))))
and then evaluated, producing;
(clojure.core/concat (clojure.core/list 5))