Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.
Ignoring Java interoperability for a moment, symbols in function position can evaluate to only two things:
The value of a named var or local, as we’ve already seen.
A Clojure special form.[18]
Special forms are Clojure’s primitive building blocks of computation, on top of which all the rest of Clojure is built. This foundation shares a lineage with the earliest Lisps, which also defined a limited set of primitives that define the fundamental operations of the runtime, and are taken as sufficient to describe any possible computation.[19] Further, special forms have their own syntax (e.g., many do not take arguments per se) and evaluation semantics.
As you’ve seen, things that are often described as primitive
operations or statements in most languages—including control forms like
when and operators like addition and
negation—are not primitives in Clojure. Rather, everything that isn’t a
special form is implemented in Clojure itself by bootstrapping from that
limited set of primitive operations.[20] The practical effect of this is that, if Clojure doesn’t
provide a language construct that you want or need, you can likely build
it yourself.[21]