I am a fan of functional programming. As a computer science student in college, I read articles by legendary tech entrepreneur and venture capitalist Paul Graham (of Y combinator fame) praising the lisp programming languages, and this excellent article at defmacro on functional programming (although it seems slanted to Haskell). Although most CS students learn about various programming paradigms (object oriented, logic, functional, etc.) in school, it was only relatively recently that the functional paradigm started gaining traction in the ‘mainstream’ of corporate programming. I’m not going to make the case for functional programming here, because the aforementioned articles do it much better than I ever could (you should read them).
I have tried to learn functional programming before, using languages like Haskell, Scala, and F#, even going so far as doing a Haskell presentation during my programming language theory class in college. However I ended up quitting halfway through learning these languages. I struggled with the type system, or the tooling, or the language itself was just too big to wrap my head around. I had heard of Clojure and thought it sounded cool, but it wasn’t until 2019 that I really decided, on a break during grad school, to sit down and actually learn it.
Clojure has the advantage of being a language that is both easy to learn and also powerful enough to write production-level code in. You can think of Clojure as the ‘Python’ of functional languages. I recently took a graduate class on ‘Symbolic Programming’ which focused on the Common Lisp programming language. There are numerous differences between the two lisp dialects, but one that is immediately apparent is that Clojure is a much more ‘purely functional’ language. Common Lisp provides facilities for looping with the ‘loop’ macro, CLOS for object orientation, setf/setq for local variables. Common lisp is a multi-paradigm language that makes it much easier to fall back on imperative styles of programming. So if you want to ‘force’ yourself to learn FP, Clojure is a better option there. Another way Clojure stands out is that it has standard facilities for networking related functionality, whereas with Common lisp these seem implementation-specific. Finally, the documentation and community for Clojure seem more complete and helpful.
The two books I used to learn Clojure were ‘Clojure for the Brave and True: Learn the Ultimate Language and Become a Better Programmer’ by Daniel Higginbotham and ‘Web Development with Clojure, Second Edition: Build Bulletproof Web Apps with Less Code’ by Dmitri Sotnikov (there is a 3rd edition out now that is more updated). I am currently reading through a Clojure book on macros.
Sotnikov’s second edition of the book was somewhat dated in parts. I haven’t read it, but I would probably direct people to the third edition of the book, which is, as of the time of writing this, still in beta. With regards to Higginbotham’s book, it leans heavily on the Emacs text editor. If you are not familiar with Emacs, I highly recommend not using it since it will be a pain to learn Emacs and a new language at the same time. Using Visual Studio Code with various Clojure extensions like ‘Calva’ is almost as good and far more beginner-friendly. If you end up going this route you can skip the first bit of Higginbotham’s book which is mostly about Emacs.