Browse files

updated readme

  • Loading branch information...
1 parent fd60f12 commit dad53043e6f061ad8199a769878e0457ed41aa58 @GeorgeJahad committed Aug 14, 2010
Showing with 62 additions and 0 deletions.
  1. +62 −0 README
@@ -0,0 +1,62 @@
+The Clojure debug-repl
+Every time I stick a println into some Clojure code to debug it, I
+think to myself, "This is Lisp! I should be able to insert a repl
+The problem is of course that Clojure's eval function doesn't know
+about the surrounding lexical scope. How to solve the problem?
+Create a macro that passes a copy of the lexical scope in with the
+form to be evaled, something like this:
+(defn eval-with-locals
+ [locals form]
+ (eval
+ `(let ~(generate-local-bindings locals)
+ ~form)))
+The interface is meant to be dead simple:
+"(use 'alex-and-georges.debug-repl)" loads it, and "(debug-repl)" invokes it.
+That's about it. When you enter the debug-repl, the regular
+repl prompt will be replaced with
+dr =>
+An example will make it clearer:
+user=> (let [c 1 d 2]
+ (defn a [b c]
+ (debug-repl)
+ d))
+user=> (a "foo" "bar")
+dr-1-1001 => c
+dr-1-1001 => d
+dr-1-1001 => *locals*
+{fn__104 #<user$eval__103 user$eval__103@5f6303>, c "bar", d 2, fn__106 #<user$eval__103$a__105 user$eval__103$a__105@179dce4>, b "foo", counter__56__auto__ 1001}
+dr-1-1001 => (str b c)
+dr-1-1001 => ()
+The debug-repl doesn't currently integrate properly
+with the slime-repl, (I think because of how Slime manages IO
+redirection,) so you'll have to invoke it from a regular repl, or
+slime's *inferior lisp* buffer.
+A version of the debug-repl has been ported to slime. More details

0 comments on commit dad5304

Please sign in to comment.