Chapter 1. Clojure philosophy
Figure 1.1. Some of the concepts that underlie the Clojure philosophy, and how they intersect
Figure 1.4. The word REPL hints at three repeated or looped phases: read, eval, and print.
Figure 1.5. More REPL phases: Clojure also has macro-expansion and compilation phases.
Chapter 2. Drinking from the Clojure fire hose
Figure 2.1. A graphical representation of the sum-down-from function
Chapter 3. Dipping your toes in the pool
Chapter 5. Collection types
Figure 5.3. The crosswise neighbors of cell 0,0
Chapter 6. Being lazy and set in your ways
Chapter 7. Functional programming
Figure 7.3. A graphical representation of Z World clearly shows the optimal/only path.
Chapter 8. Macros
Chapter 9. Combining data and code
Figure 9.2. The directories layout for an illustrative joy.contracts namespace
Figure 9.3. The top of the source file for the joy.contracts namespace
Chapter 10. Mutation and concurrency
Figure 10.2. Tom inserts data into the work queue
Figure 10.3. Tom inserts data into the work queue while Crow and Joel consume it at their leisure.
Figure 10.5. The king neighbors of cell 1,1
Figure 10.5. Illustrating an STM retry: Clojure’s STM works much like a database.
Chapter 11. Parallelism
Chapter 12. Java.next
Figure 12.2. A directory listing served by the simple web server
Figure 12.3. File details served by the simple web server
Figure 12.5. You can update the DynaFrame on the fly without restarting.
Figure 12.6. Using only a handful of rudimentary containers, you can build neato GUI prototypes.
Chapter 14. Data-oriented programming
Figure 14.5. The Ant engine: Ant takes a build specification and returns a build artifact.
Figure 14.7. Integrating polyglot systems using events as data
Figure 14.8. Clojure code is a data structure that Clojure can manipulate.
Chapter 15. Performance
Chapter 16. Thinking programs
Chapter 17. Clojure changes the way you think
Figure 17.1. Using defformula is akin to programming a spreadsheet.