(defmacro do-loop "vaguely based on 'new-style' do loop from MacLisp. vars is a vector of [local init step-expr ...] test is a condition to stop looping on result is an expression to return the value of body is evaluated for side effects only." [vars test result & body] (let [vars (partition-all 3 vars)] `(loop [~@(interleave (map first vars) (map second vars))] (if ~test ~result (do ~@body (recur ~@(map last vars))))))) (set! *warn-on-reflection* true) (set! *unchecked-math* :warn-on-boxed) (defn factorial ^long [^long n] (do-loop [j n (dec j) f 1 (* j f)] (zero? j) f))