
debugger
By: a guest on
Apr 2nd, 2012 | syntax:
Clojure | size: 0.96 KB | hits: 27 | expires: Never
;;debug-repl on demand with all local bindings available
;;USEFUL
(defmacro local-bindings
"Produces a map of the names of local bindings to their values."
[]
(let [symbols (map key @clojure.lang.Compiler/LOCAL_ENV)]
(zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))
(declare *locals*)
(defn eval-with-locals
"Evals a form with given locals. The locals should be a map of symbols to
values."
[locals form]
(binding [*locals* locals]
(eval
`(let ~(vec (mapcat #(list % `(*locals* '~%)) (keys locals)))
~form))))
(defn db-read [request-prompt request-exit]
(let [input (clojure.main/repl-read request-prompt request-exit)]
(if (= input '()) request-exit
input)))
;usage
(defmacro debug-repl
"Starts a REPL with the local bindings available."
[]
`(clojure.main/repl
:prompt #(print "debug=> ")
:eval (partial eval-with-locals (local-bindings))
:read db-read))