Programming in Clojure. Part 2: Functional Programming