Don't like ads? PRO users don't see any ads ;-)
Guest

debugger

By: a guest on Apr 2nd, 2012  |  syntax: Clojure  |  size: 0.96 KB  |  hits: 27  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. ;;debug-repl on demand with all local bindings available
  2. ;;USEFUL
  3.  
  4. (defmacro local-bindings
  5.   "Produces a map of the names of local bindings to their values."
  6.   []
  7.   (let [symbols (map key @clojure.lang.Compiler/LOCAL_ENV)]
  8.     (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))
  9.  
  10. (declare *locals*)
  11. (defn eval-with-locals
  12.   "Evals a form with given locals. The locals should be a map of symbols to
  13. values."
  14.   [locals form]  
  15.   (binding [*locals* locals]  
  16.     (eval
  17.      `(let ~(vec (mapcat #(list % `(*locals* '~%)) (keys locals)))
  18.         ~form))))
  19.        
  20. (defn db-read [request-prompt request-exit]
  21.   (let [input (clojure.main/repl-read request-prompt request-exit)]
  22.   (if (= input '()) request-exit
  23.            input)))    
  24. ;usage
  25. (defmacro debug-repl
  26.   "Starts a REPL with the local bindings available."
  27.   []
  28.   `(clojure.main/repl
  29.     :prompt #(print "debug=> ")
  30.     :eval (partial eval-with-locals (local-bindings))
  31.     :read db-read))