I lost the original version of this post. C’est la vie. The gist is that
Clojure’s standard case
macro somewhat surprisingly (to me) does not support
arbitrary expressions as test conditions – only read-time constants. It does
this because it’s primary use from the Clojure-implementation perspective is to
support fast dispatch on symbol/keyword values.
Other people have blogged about this and provided their own less-surprising implementations, include cemerick.
I didn’t like any of the ones I found elsewhere, so here’s mine:
(defmacro case-expr "Like case, but only supports individual test expressions, which are evaluated at macro-expansion time." [e & clauses] `(case ~e ~@(concat (mapcat (fn [[test result]] [(eval `(let [test# ~test] test#)) result]) (partition 2 clauses)) (when (odd? (count clauses)) (list (last clauses))))))
Enjoy!