Way back in Learning Clojure #12 I talked about using condp as a simpler form of cond, kind of like a Java switch. In Clojure 1.2, there is a new function called case that is even a closer match for this idea.
In the example from the last post:
(defn test-condp [x] (condp = x 0 "got 0" 1 "got 1" (str "else " x)))
you can rewrite this example with case as follows:
(defn test-case [x] (case x 0 "got 0" 1 "got 1" (str "else " x)))
There are several restrictions in case vs condp:
- case only works with “=” as the condition function
- the matching expressions must be compile-time literals (strings, numbers, symbols, keywords, and collections of those
The benefit of case is that unlike cond and condp, it is not a sequential search for a match – the match is O(1). From an implementation point of view, all of the match expressions become keys in a map and the match occurs via a lookup on that map.