(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))

Generated At 2023-12-12T11:41:06-0800 original