Foreword xiii
Preface xv
Acknowledgments xxi
About the Author xxiii
Part I: Functional Basics 1
Chapter 1: Immutability 3
What Is Functional Programming? 4
The Problem with Assignment 7
So Why Is It Called Functional? 10
No Change of State? 12
Immutability 15
Chapter 2: Persistent Data 17
On Cheating 19
Making Copies 20
Structural Sharing 23
Chapter 3: Recursion and Iteration 27
Iteration 28
Recursion 32
Chapter 4: Laziness 37
Lazy Accumulation 40
OK, but Why? 41
Coda 42
Chapter 5: Statefulness 43
When We MUST Mutate 47
Software Transactional Memory (STM) 48
Life Is Hard, Software Is Harder 51
Part II: Comparative Analysis 53
Chapter 6: Prime Factors 55
Java Version 56
Clojure Version 60
Conclusion 63
Chapter 7: Bowling Game 65
Java Version 66
Clojure Version 71
Conclusion 75
Chapter 8: Gossiping Bus Drivers 77
Java Solution 78
Clojure 88
Conclusion 93
Chapter 9: Object-Oriented Programming 95
Functional Payroll 98
Namespaces and Source Files 107
Conclusion 108
Chapter 10: Types 109
Part III: Functional Design 115
Chapter 11: Data Flow 117
Chapter 12: SOLID 125
The Single Responsibility Principle (SRP) 126
The Open-Closed Principle (OCP) 131
The Liskov Substitution Principle (LSP) 138
The Interface Segregation Principle (ISP) 147
The Dependency Inversion Principle (DIP) 152
Part IV: Functional Pragmatics 181
Chapter 13: Tests 183
But What about the REPL? 184
What about Mocks? 184
Property-Based Testing 186
A Diagnostic Technique 190
Functional 197
Chapter 14: GUI 199
Turtle-Graphics in Quil 200
Chapter 15: Concurrency 215
Conclusion 225
Part V: Design Patterns 227
Chapter 16: Design Patterns Review 229
Patterns in Functional Programming 233
Abstract Server 233
Adapter 236
Command 242
Composite 249
Decorator 260
Visitor 264
Abstract Factory 274
Conclusion 281
Postscript: OO Poison? 282
Part VI: Case Study 285
Chapter 17: Wa-Tor 287
Scratch That Itch 309
Showers Solve Problems 312
It's Time to Wildly Reproduce 322
What about the Sharks? 324
Conclusion 335
Afterword 337
Index 341