store/[org.clojure/clojure "1.8.0"] clj::clojure.core/with-local-vars

Official Documentation

Add notes
Arities
==================================================
   [name-vals-vec & body]

Docstring
==================================================
  varbinding=> symbol init-expr

  Executes the exprs in a context in which the symbols are bound to
  vars with per-thread bindings to the init-exprs.  The symbols refer
  to the var objects themselves, and must be accessed with var-get and
  var-set

Source

(defmacro with-local-vars
  "varbinding=> symbol init-expr

  Executes the exprs in a context in which the symbols are bound to
  vars with per-thread bindings to the init-exprs.  The symbols refer
  to the var objects themselves, and must be accessed with var-get and
  var-set"
  {:added "1.0"}
  [name-vals-vec & body]
  (assert-args
     (vector? name-vals-vec) "a vector for its binding"
     (even? (count name-vals-vec)) "an even number of forms in binding vector")
  `(let [~@(interleave (take-nth 2 name-vals-vec)
                       (repeat '(.. clojure.lang.Var create setDynamic)))]
     (. clojure.lang.Var (pushThreadBindings (hash-map ~@name-vals-vec)))
     (try
      ~@body
      (finally (. clojure.lang.Var (popThreadBindings))))))

Example 1

Edit
;; with-local-vars allows you to write more imperative-style code, for cases
;; where you really want to.  factorial isn't a case where it helps, but
;; it is short and familiar.  Note that (var-get acc) can be abbreviated
;; as @acc
(defn factorial [x]
  (with-local-vars [acc 1, cnt x]
    (while (> @cnt 0)
      (var-set acc (* @acc @cnt))
      (var-set cnt (dec @cnt)))
    @acc))
;; => #'user/factorial

(factorial 7)
;; => 5040

Uses on crossclj