1.4. Why Clojure isn’t especially object-oriented
Chapter 2. Drinking from the Clojure firehose
2.2. Putting things together: collections
2.3. Making things happen: functions
2.5. Locals, loops, and blocks
2.6. Preventing things from happening: quoting
2.7. Leveraging Java via interop
2.7.1. Accessing static class members
2.7.2. Creating Java class instances
2.7.3. Accessing Java instance members with the . operator
2.8. Exceptional circumstances
2.9.1. Creating namespaces using ns
2.9.2. Loading other namespaces with :require
2.9.3. Loading and creating mappings with :use
Chapter 3. Dipping our toes in the pool
3.3.1. Your assignment, should you choose to accept it
3.3.2. Destructuring with a vector
3.3.3. Destructuring with a map
3.4. Using the REPL to experiment
3.4.1. Experimenting with seqs
3.4.2. Experimenting with graphics
4.5. Regular expressions—the second problem
Chapter 5. Composite data types
5.1. Persistence, sequences, and complexity
5.1.1. “You keep using that word. I do not think it means what you think it means.”
5.2. Vectors: creating and using them in all their varieties
5.3. Lists: Clojure’s code form data structure
5.4. How to use persistent queues
5.5.1. Basic properties of Clojure sets
5.7. Putting it all together: finding the position of items in a sequence
Chapter 6. Being lazy and set in your ways
6.2. Designing a persistent toy
6.3.1. Familiar laziness with logical-and
6.3.2. Understanding the lazy-seq recipe
6.4. Putting it all together: a lazy quicksort
Chapter 7. Functional programming
7.1. Functions in all their forms
7.4. Putting it all together: A* pathfinding
8.2. Defining control structures
8.2.1. Defining control structures without syntax-quote
8.2.2. Defining control structures using syntax-quote and unquoting
8.4. Using macros to change forms
8.5. Using macros to control symbolic resolution time
8.6. Using macros to manage resources
Chapter 9. Combining data and code
9.2. Exploring Clojure multimethods with the Universal Design Pattern
9.2.3. Multimethods to the rescue
9.2.4. Ad hoc hierarchies for inherited behaviors
9.3. Types, protocols, and records
9.4. Putting it all together: a fluent builder for chess moves
10.1. Generating objects on the fly with proxy
10.2. Clojure gen-class and GUI programming
10.2.1. Namespaces as class specifications
10.2.2. Exploring user interface design and development with Clojure
10.3. Clojure’s relationship to Java arrays
10.3.1. Types of arrays: primitive and reference
10.3.3. That unfortunate naming convention
10.4. All Clojure functions implement...
10.5. Using Clojure data structures in Java APIs
10.7.1. A bit of background regarding exceptions
11.1. Software transactional memory with multiversion concurrency control and snapshot isolation
11.2.1. Coordinated, synchronous change using alter
11.2.2. Commutative change with commute
11.2.3. Vulgar change with ref-set
11.3.1. In-process versus distributed concurrency models
11.3.2. Controlling I/O with an Agent
11.7.1. Parallel tasks with promises
11.9. Vars and dynamic binding
12.1.1. Advantages of type adornment
12.2.2. Transients compare in efficiency to mutable collections
12.5.1. First rule of coercion: don’t
12.5.2. Corollary: you’re probably not doing it right
12.5.3. Second rule of coercion: don’t
12.5.4. Third rule of coercion: coerce a stable local
Chapter 13. Clojure changes the way you think
13.3. A lack of design patterns
13.4. Error handling and debugging
3.143.5.217