On May 28, 2013, at 7:00 AM, Piotr Klibert wrote:

> Hello,
> 
> I like an idea of setting breakpoint and when it is reached during runtime 
> dropping into the interactive shell. It's done in Python with pdb and in one 
> of the Schemes (Gambit?). I tried, but I couldn't make anything similar for 
> Racket.
> 
> At first I looked at namespaces and (read-eval-print-loop), but that didn't 
> work. I could "load" the top-level module namespace, but I couldn't hook into 
> the namespace inside the function (if it even exists as a namespace).
> 
> Then I tried to look inside the GUI debugger, and I realized that it uses a 
> macro which inserts some function call before and after every expression. The 
> debugger code was too hard for me to comprehend fully and I couldn't make it 
> work the way I wanted, too.
> 
> It was some time ago, so sorry for the lack of specifics, but my question is: 
> is it possible, and how, to do something like this in Racket:
> 
>     (define (fun)
>       (define a 9)
>       (define b '(a b c))
>       (let
>           ([d display])
>         (set-trace))
>       (displayln "We're here!"))
> 
>     (fun) ;; starts repl, where
> 
>     > a
>     9
>     >(d b)
>     (a b c)> (continue)
>     We're here!


Yep, you can definitely do this. 

To show this, I've just built a simple proof-of-concept command-line debugger; 
it's barely functional (NPI), but there shouldn't be any huge conceptual 
hurdles (and I don't have time to spend more time on it right now (unless I get 
a lot of interest :))).

I've pushed "command-line-debugger-example.rkt" in the stepper collection to 
the plt repo. As an alternative to compiling the whole tree (or waiting for a 
nightly build), I've also created a gist:

https://gist.github.com/jbclements/5671991

You can copy this file into the "collects/stepper" directory.

Here's an example of using it (this example also appears in the file itself):

Put the following code in /tmp/foo.rkt:

#lang racket

(define (f x) (+ x 14))

(f 9)

Then, you might run it from the command line like this:

jclements-09740:~/plt/collects/stepper clements> racket
Welcome to Racket v5.3.4.7.
> (require "command-line-debugger-example.rkt")
> (run-program "/tmp/foo.rkt")
> *ding* a new step has arrived:
'#s(step #f expr-finished-break ((#<procedure:...ate/annotate.rkt:1061:62> #f 
#<procedure>)))
(srcloc)
step-srcloc: no source contexts in this step
  context...:
   /Users/clements/plt/collects/racket/private/misc.rkt:87:7
> (continue)
> *ding* a new step has arrived:
'#s(step (#<procedure> #<procedure> #<procedure>) normal-break #f)
(srcloc)
#<syntax:5:1 f>
> (continue)
> *ding* a new step has arrived:
'#s(step (#<procedure> #<procedure> #<procedure>) result-value-break 
(#<procedure>))
(srcloc)
#<syntax:5:1 f>
> (continue)
> *ding* a new step has arrived:
'#s(step (#<procedure> #<procedure>) normal-break #f)
(srcloc)
#<syntax:5:0 (#%app f (quote 9))>
> (exit)

Note that while I spent the five minutes required to extract some semblance of 
source locations, I have not spent the additional five minutes required to 
expose variable bindings… I'd be happy to do this, if people are actually 
interested in it.

Best,

John 


____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to