Chapter 1. Introducing Clojure
1.3. Host interoperation: A JVM crash course
1.3.1. Java types, classes, and objects
Chapter 2. Clojure elements: Data structures and functions
2.1.3. Looking up documentation using doc, find-doc, and apropos
Chapter 3. Building blocks of Clojure
3.2. Java exceptions: try and throw
Chapter 4. Multimethod polymorphism
4.1. Polymorphism and its types
4.2. Polymorphism using multimethods
4.2.1. Life without multimethods
Chapter 5. Exploring Clojure and Java interop
5.1. Calling Java from Clojure
5.1.1. Importing Java classes into Clojure
5.1.3. Accessing methods and fields
5.1.4. Macros and the dot special form
5.2. Compiling Clojure code to Java bytecode
5.2.1. Example: A tale of two calculators
5.2.2. Creating Java classes and interfaces using gen-class and gen-interface
Chapter 6. State and the concurrent world
6.2. Separating identities and values
6.8. State and its unified access model
6.9. Deciding which reference type to use
Chapter 7. Evolving Clojure through macros
7.2. Macros from within Clojure
Chapter 8. More on functional programming
8.1. Using higher-order functions
8.1.1. Collecting results of functions
8.3.1. Free variables and closures
Chapter 9. Protocols, records, and types
9.1.1. Setting up the example scenario
9.1.2. A closer look at the expression problem and some potential solutions
9.2. Examining the operations side of the expression problem
9.3. Examining the data types side of the expression problem with protocols
9.3.1. defprotocol and extend-protocol
9.3.2. Defining data types with deftype, defrecord, and reify
Chapter 10. Test-driven development and more
10.1. Getting started with TDD: Manipulating dates in strings
10.1.2. month-from and year-from
10.2. Improving tests through mocking and stubbing
Chapter 11. More macros and DSLs
11.1. A quick review of macros
11.3. Shifting computation to compile time
11.5. Domain-specific languages