Giter Site home page Giter Site logo

debug-repl's Introduction

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
here!"

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)))

USE:
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

user=>   (a "foo" "bar")

dr-1-1001 => c
"bar"

dr-1-1001 => d
2

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)
"foobar"

dr-1-1001 => ()
2
user=> 

LIMITATIONS:
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
here:
http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml

debug-repl's People

Contributors

georgejahad avatar gfredericks avatar drtom avatar

Stargazers

Justin Tirrell avatar Aryeh Hillman avatar Siddharth Jain avatar Otavio avatar Elton Law avatar Oliver Day avatar  avatar Andrew Foltz-Morrison avatar Kirill Chernyshov avatar  avatar Dominik Bylica avatar Andrey Bogoyavlenskiy avatar Andy Fingerhut avatar Serge Osipov avatar Stepan Anchugov avatar hamlet avatar Pawel Ceranka avatar Neil Lambert avatar Terje Dahl avatar Brian Kustra avatar Eric avatar Stephen Brady avatar Dan Jay avatar Saad Shahd avatar Chris Blom avatar Alex Knauth avatar Greg Hendershott avatar Rafa Leblic avatar Shane Lin avatar Leonid Kovnatskiy avatar Miguel Guinada avatar Steve Chan avatar Alex Podaras avatar Lewis Zhang avatar Derek Slager avatar javier abanses avatar Brandon Orther avatar Christopher Thomas Davies avatar Christopher Elwell avatar Mattias Dalkvist avatar Paolo Gavocanov avatar  avatar Karol Marcjan avatar Jeff Stokes avatar Dustin Getz avatar johann bestowrous avatar  avatar Saeid Akbari Bibihayat avatar  avatar Łukasz Korecki avatar Goran Savovski avatar Corey Williams avatar  avatar Brian Dawn avatar Tomoya Chiba avatar Russell Mull avatar Gert Goet avatar Jack Pooley avatar Andrew Lawson avatar Mathieu Gauthron avatar Grzegorz Caban avatar Will Farrell avatar Han Tuzun avatar Jay Martin avatar Lynn Dylan Hurley avatar Tamim Sookoor avatar Tomas Brambora avatar Eric Bailey avatar Paul DeLong avatar Scott Jappinen avatar Vitalie Spinu avatar William Roe avatar Claudia Doppioslash avatar Rafik NACCACHE avatar Paul avatar Dominic LoBue avatar Daniel Ribeiro avatar Kevin McCarthy avatar Kyle Oba avatar Dane Schneider avatar  avatar Joseph Moore avatar Alan Thompson avatar Yang Wang avatar Michael-Keith Bernard avatar Josh Black avatar Kyrre Wahl Kongsgård avatar  avatar Scott Abernethy avatar Stathis Sideris avatar Lars Andersen avatar Alexander Solovyov avatar Josef Galea avatar  avatar James Warren avatar Kris Jenkins avatar Adam Hill avatar Guru Devanla avatar Andrey Antukh avatar Daniel Duckworth avatar

Watchers

Alex Osborne avatar James Warren avatar Matt Miller avatar Claudia Doppioslash avatar James Cloos avatar  avatar Guillaume Erétéo avatar Daniel Slutsky avatar Terje Dahl avatar  avatar

debug-repl's Issues

(quit-dr) throw an error

(quit-dr)
;;=> Exception$Enumeration$f482e887 vendors.debug_repl.proxy$java.lang.Exception$Enumeration$f482e887.fillInStackTrace (:-1)

dr-1-1001 => (.printStackTrace *e)

;;=> vendors.debug_repl.proxy$java.lang.Exception$Enumeration$f482e887
at vendors.debug_repl.proxy$java.lang.Exception$Enumeration$f482e887.fillInStackTrace(Unknown Source)
at java.lang.Throwable.(Throwable.java:181)
at java.lang.Exception.(Exception.java:29)
at vendors.debug_repl.proxy$java.lang.Exception$Enumeration$f482e887.(Unknown Source)
at vendors.debug_repl$fn__16719.invoke(debug_repl.clj:86)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3509)
at clojure.lang.Compiler$DefExpr.eval(Compiler.java:417)
at clojure.lang.Compiler.eval(Compiler.java:6647)
at clojure.lang.Compiler.load(Compiler.java:7069)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.loadResourceScript(RT.java:361)
at clojure.lang.RT.load(RT.java:440)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5027.invoke(core.clj:5561)
at clojure.core$load.doInvoke(core.clj:5560)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5366)
at clojure.core$load_lib$fn__4976.invoke(core.clj:5406)
at clojure.core$load_lib.doInvoke(core.clj:5405)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5444)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:621)
at clojure.core$use.doInvoke(core.clj:5538)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at utils.utils$eval16693.invoke(form-init1922168186769041658.clj:12)
at clojure.lang.Compiler.eval(Compiler.java:6642)
at clojure.lang.Compiler.eval(Compiler.java:6605)
at clojure.core$eval.invoke(core.clj:2883)
at clojure.main$repl$read_eval_print__6581$fn__6584.invoke(main.clj:239)
at clojure.main$repl$read_eval_print__6581.invoke(main.clj:239)
at clojure.main$repl$fn__6590.invoke(main.clj:257)
at clojure.main$repl.doInvoke(main.clj:257)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.main$repl_opt.invoke(main.clj:323)
at clojure.main$main.doInvoke(main.clj:421)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.Var.applyTo(Var.java:708)
at clojure.main.main(main.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at user$eval1015.invoke(form-init1922168186769041658.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6642)
at clojure.lang.Compiler.eval(Compiler.java:6632)
at clojure.lang.Compiler.load(Compiler.java:7069)
at clojure.lang.Compiler.loadFile(Compiler.java:7025)
at clojure.main$load_script.invoke(main.clj:274)
at clojure.main$init_opt.invoke(main.clj:279)
at clojure.main$initialize.invoke(main.clj:307)
at clojure.main$null_opt.invoke(main.clj:342)
at clojure.main$main.doInvoke(main.clj:420)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:391)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:708)
at clojure.main.main(main.java:37)
nil

Clojure 1.3.0 Support

Clojure 1.3.0 complains about rebinding things like locals. It don't like that no more.

Push to clojars please.

java.lang.IllegalStateException: Can't dynamically bind non-dynamic var: alex-and-georges.debug-repl/level

is annoying.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.