Вы можете использовать динамический глобальный var, связанный со значением с binding
в сочетании со специальной формой set!
, чтобы изменить его значение.Вары, связанные с binding
, являются локальными для потока.Следующее значение будет увеличиваться *counter*
каждый раз, когда my-fn вызывается для любой формы, вызываемой в with-counter
вызове:
(def ^{:dynamic true} *counter*)
(defmacro with-counter [& body]
`(binding [*counter* 0]
~@body
*counter*))
(defn my-fn []
(set! *counter* (inc *counter*)))
Чтобы продемонстрировать, попробуйте:
(with-counter (doall (repeatedly 5 my-fn)))
;; ==> 5
Для получения дополнительной информацииинформация см. http://clojure.org/vars#set