Skip to content

Instantly share code, notes, and snippets.

@ordnungswidrig
Created January 19, 2011 14:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ordnungswidrig/534499f402463b935d62 to your computer and use it in GitHub Desktop.
Save ordnungswidrig/534499f402463b935d62 to your computer and use it in GitHub Desktop.
expression logging in clojure
(ns formlog)
(declare *log*)
(defn make-log [] (ref []))
(defmacro logged [& forms]
(let [form (gensym "form")]
`(dosync
~@(map (fn [form]
`(do (alter *log* conj '~form)
~form))
forms))))
(defn playlog [log]
(dosync
(last
(for [form @log]
(eval form)))))
(defmacro with-log [log-ref & body]
`(binding [*log* ~log-ref]
~@body))
(defn run-test-1 []
(let [counter (ref nil)
log (make-log)]
(with-log log
(logged (ref-set counter 0))
(logged (alter counter inc ))
(logged (alter counter inc))
(logged (alter counter #(* % %))
(alter counter * 2)))
(prn @counter)
(prn @log)
;; alter counter outside with-log...
(with-log log
(dosync (alter counter dec)))
(prn @counter)
;; ... is not registered in log
(prn @log)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment