Many Lisp beginners find quoting to be a foreign concept. My own confusions
quote and friends began with my first ventures into Scheme, and
continue today with the occasional crazy Clojure macro. So I'd like to take
some time to look deeper into quoting, one of the most Lispy of the Lisp
features. It's a crucial area for budding macro writers to master, and a bit of
investment here can really pay off.
The examples are all in Clojure, and many aspects will apply to other Lisps, with minor syntax tweaks.
First and most importantly, the
quote special form is one of the most basic
in Lisp.  Let's start with an example:
quote around a form will return that form, without evaluating it.
That form could be a symbol:
or a list of symbols :
or any other arbitrary expression:
Keep in mind that with all these lists, with all the nesting, any symbols you see are literally symbols. Evaluation, and therefore resolution of those symbols to functions or other values, is totally out of the picture.
I don't see a lot of explicit use of
quote in actual code, though. More
often, people use a shorthand:
As you can see, using the single-quote character works in exactly the same way. Just remember that with both of these syntax variants, when you see an opening parenthesis, the quote applies to everything up to and including the matching closing parenthesis.  Once you've done this a few times, you'll get the idea.
syntax-quote and unquote
Syntax-quote behaves pretty similarly to
quote, but there a number of differences
make it far more powerful, and potentially far more confusing. Assume for a
brief moment that things work exactly the same as
quote, and we'll talk about
where that's not the case. First, there's no longhand analog to
syntax-quote.  You'll need to use the backtick character (
When you write a symbol inside a syntax-quoted form, the reader will actually resolve the symbol rather than just taking it at face value. The result is that namespace-qualified symbols are the norm in a syntax-quoted form:
This has important implications for macro writing that are outside the scope of this article, so this namespace qualification is worth remembering.
Probably more well-known is the fact that a syntax-quoted form allows for unquoting inside it.
We can think of the tilde (
~) as saying that we bounce outside the surrounding
syntax-quoted form and evaluate the following form in that context, inserting
the result back where the tilde was. Note that here our result is a symbol, but
it's not namespace-qualified. The tilde, just like the two quotes, applies to
the form immediately following it.
The splicing unquote is similar to unquote, except that it allows multiple forms to be inserted in the place of a single unquote-splicing form:
There's a bit of an analogy between splicing-unquote and
apply, in that they
both appear to "unroll" a collection into multiple expressions.
Both of these unquote operations are meaningless outside of syntax-quote forms:
Another special bit of syntax only available inside the syntax-quote is the
gensym, or "generated symbol" syntax:
The generated symbol corresponds to the output of
prefixed by the name before the # sign, and multiple occurrences of the symbol
within the syntax-quoted form are made to be the same. These properties can be
really handy for macro writing to avoid what are known as variable capture
mixing and matching
If things haven't been clear up until this point in the article, you may want to either re-read the preceding sections or skip ahead, because mixing up different combinations of unquoting and quoting is where things really get crazy.
What if we want a non-namespaced symbol inside a form, but we really want the power of unquoting in other places in the form? For example, we have this:
We want the non-namespaced symbol
c in the form instead of
notice that symbols and parentheses aren't the only things quotes and unquotes
can apply to: they work on any expression. Keeping in mind that if the result
of an unquote operation is a symbol, that symbol won't be namespaced by the
surrounding quoted form, the solution makes sense:
For awhile, I memorized this
~' syntax by rote, and that works fine, but it's
not necessary when the reasoning is obvious. Armed with that knowledge, you can
probably also guess the [unimpressive] result if you were to use
Generally it's fine to think of the normal
quote form as something like a
literal, but there's more complexity underneath. Consider what happens when a
quote form is nested inside a syntax-quote form:
The unquote form will still be evaluated as usual, but the result will be quoted. So if we want a plain, non-namespaced, quoted symbol inside our generated form, we need look no further:
An edge case this brings to mind that's fun to think about is quoting the result of the splicing unquote:
There's no good practical use I'm aware of for this, because
quote only uses its first
argument, but it did help me to understand the way
' forms expand to
If you have the misfortune to deal with code that uses nested syntax-quotes, I'm sorry (and I hope I didn't write it). The expansion is confusing to read:
And unquoting is a little tricky:
Since we have two levels of syntax-quoting, we'd need to bounce out two levels
of unquoting in order to actually evaluate
(- 9 6).
So, what the heck is going on with all the list/seq/concat madness? Don't worry too much about it, but if you work out the result, or just eval it, you'll see that the result makes sense:
There are, of course, plenty of other combinations you could dream up to amaze and confuse your friends. Hopefully at this point you've built up enough background to solve most of the quoting confusion you'll encounter. And if not, fire up a REPL and experiment!
 Symbols are most often used to refer to functions or data in code. They have a sort of dual meaning, depending on their quoted-ness. When quoted, symbols refer to themselves, nothing more or less. When not quoted, their values are determined by local, dynamic, and namespace bindings.
 Same deal for square and curly braces in Clojure.
 Let Over Lambda and On Lisp are two great resources to learn more. Suffice to say, the automatic gensyms and namespace qualification (coupled with the illegality of letting a namespaced symbol) inside syntax-quote forms are a huge help in avoiding accidental variable capture.