In this part of the book, we’ll expose some of the underpinnings of Clojure’s approach to functional programming, as well as some practical uses of it. Clojure provides mechanisms for immutability, deferred execution, closures, and recursion. We’ll show examples of how these can work together to let you create data structures of your own, and find routes through a weighted graph.