My personal list of reasons for preferring Clojure to other Lisps (p.s. I still think all Lisps are great!):
-
Runs on the JVM – hence gets automatic access to the fantastic engineering in the JVM itself (advanced garbage collection algorithms, HotSpot JIT optimisation etc.)
-
Very good Java interoperability – provides compatibility with the huge range of libraries in the Java/JVM language ecosystem. I have used Clojure as a “glue” language to connect different Java libraries with good effect. As I also develop a lot of Java code it is helpful for me that Clojure integrates well with Java tooling (e.g. I use Maven, Eclipse with Counterclockwise plugin for my Clojure development)
-
Nice syntax for vectors
[1 2 3], maps{:bob 10, :jane 15}and sets#{"a" "b" "c"}– I consider these pretty essential tools for modern programming (in addition to lists of course!) -
I personally like the use of square brackets for binding forms: e.g.
(defn foo [a b] (+ a b))– I think it makes code a bit clearer to read. -
Emphasis on lazy, functional programming with persistent, immutable data structures – in particular all the core Clojure library is designed to support this by default
-
Excellent STM implementation for multi-core concurrency. I believe Clojure has the best concurrency story of any language at the moment (see this video for more elaboration by Rich Hickey himself)
-
It’s a Lisp-1 (like Scheme), which I personally prefer (I think in a functional language it makes sense to keep functions and data in the same namespace)