Understanding the reader
The reader is responsible for interpreting Clojure code. It performs several steps to translate source code in textual representation into executable machine code. In this section, we will briefly describe these steps performed by the reader to illustrate how the reader works.
Clojure and other languages from the Lisp family are homoiconic. In a homoiconic language, the source code of a program is represented as a plain data structure. This means that all the code written in a Lisp language is simply a bunch of nested lists. Thus, we can manipulate programs' code just like any other list of values. Clojure has a few more data structures, such as vectors and maps in its syntax, but they can be handled just as easily. In languages that are not homoiconic, any expression or statement in a program has to be translated into an internal data structure termed as a parse tree, or syntax tree, when the program is compiled or interpreted. In Lisps, however, an expression...