Posts for the month of March 2012

Why not Clojure

#summary Clojure isn't a Lisp.

What's wrong with Clojure?

Clojure is not Lisp. It is some looking-like-lisp language that somehow compiles into Java bytecode with some features of a Lisp, such a prefix notation, reader and even macros.

There is one of the very essential abilities of a Lisp as a language. This is citation from the original John McCarthy paper:

d. Recursive Function Definitions. By using conditional expressions we can, without circularity, define functions by formulas in which the defined function occurs.

For example, we write n! = (n = 0 → 1, T → n · (n − 1)!)

which means exactly this:

(define (factorial n)
   (if (= n 0)
      1
      (* n (factorial (- n 1)))))

But what we got in idiomatic Clojure is this imperative nonsense:

(def factorial
  (fn [n]
    (loop [cnt n acc 1]
       (if (zero? cnt)
            acc
          (recur (dec cnt) (* acc cnt))))))

So, we cannot define a function recursively. We must use imperative looping instead. That is not Lisp way.

The lack of tail call optimization is not the issue, and usage of a loop macro stolen from Common Lisp with this recur hack doesn't make it more Lisp-ish. We cannot express our idea clearly, without avoiding useless state variables.