This may also be relevant.
The following works:
(defn factorial [& args]
(match [args]
[([n] :seq)] (factorial 1 n)
[([so-far 1] :seq)] so-far
[([so-far n] :seq)] (factorial (* n so-far) (dec n))))
user=> (factorial 5)
120
However, changing the order of clauses stops that:
(defn factorial [& args]
(match [args]
[([so-far 1] :seq)] so-far
[([so-far n] :seq)] (factorial (* n so-far) (dec n))
[([n] :seq)] (factorial 1 n))) ;; <<== moved this down
user=> (factorial 5)
NullPointerException clojure.lang.Numbers.ops (Numbers.java:942)