[gambit-list] stepper hook
Marc Feeley
feeley at iro.umontreal.ca
Fri Jul 21 09:46:24 EDT 2006
On 21-Jul-06, at 4:04 AM, Christian wrote:
> I've now tried this:
>
> (define (stepper-init)
> (set! ##main-stepper
> (vector
> (make-vector 7
> (lambda args
> (##continuation-capture
> (lambda (cont)
> (set! conts (cons cont conts))))
> (apply ##step-handler args)))
> #f #f #f #f #f #f #f)))
>
> (define (stepper-off)
> ;; reset to the original handler.
> (set! ##main-stepper
> (vector
> (make-vector 7
> ##step-handler)
> #f #f #f #f #f #f #f)))
>
> (stepper-init)
>
>
> If I call stepper-init immediately, before loading the code that I
> want to step into, the issue with stepping being "turned off after a
> few steps" has gone (I wonder why?).
>
It is because the value of ##main-stepper is attached to the code
when the interpreter "compiles" it (i.e. when a file is loaded or an
expression is evaluated at the REPL or by calling eval). So
modifying the value of the variable ##main-stepper will only affect
the code loaded after the variable is changed. In principle, this
allows you to attach a different stepper to different modules, but
Gambit does not take advantage of that.
You can get around this by modifying the main stepper vector itself,
i.e.:
(define (stepper-init)
(vector-set!
##main-stepper
0
(make-vector 7
(lambda args
(##continuation-capture
(lambda (cont)
(set! conts (cons cont conts))))
(apply ##step-handler args)))))
> The new handler catches continuations including the ##step-handler
> call, to make sure I will be able to continue the stepping process,
> as I hope.
>
> Here's a sequence of commands I'm trying:
>
>> (bruse exp-stepper)
>> (use cj-transactionlog)
>> (step)
>> (transactionlog:open '("tmp/bla"))
> *** STOPPED IN (stdin)@4.2
> 1> #||#,s;
> | > transactionlog:open
> | #<procedure #2 transactionlog:open>
> *** STOPPED IN (stdin)@4.22
> 1> #||#,s;
> | > '("tmp/bla")
> | ("tmp/bla")
> *** STOPPED IN (stdin)@4.1
> 1> #||#,s;
> | > (transactionlog:open '("tmp/bla"))
> *** STOPPED IN transactionlog:open, "cj-transactionlog.scm"@19.4
> 1> #||#,s;
> | | > make-transactionlog
> | | #<procedure #3 make-transactionlog>
> *** STOPPED IN transactionlog:open, "cj-transactionlog.scm"@19.24
> 1> #||#,s;
> | | > list-of-filepaths
> | | ("tmp/bla")
> *** STOPPED IN transactionlog:open, "cj-transactionlog.scm"@21.10
> 1> #||#,s;
> | | > list-of-filepaths
> | | ("tmp/bla")
> *** STOPPED IN transactionlog:open, "cj-transactionlog.scm"@22.10
> 1> #||#,s;
> | | > #f
> | | #f
> *** STOPPED IN transactionlog:open, "cj-transactionlog.scm"@23.10
> 1> ,c
> | #<transactionlog #4 files: ("tmp/bla") curfile: ("tmp/bla") port:
> #f parser...
> #<transactionlog #4
> files: ("tmp/bla")
> curfile: ("tmp/bla")
> port: #f
> parser: #f>
>> (stepper-off)
>> conts
> (#<continuation #5>
> #<continuation #6>
> #<continuation #7>
> #<continuation #8>
> #<continuation #9>
> #<continuation #10>
> #<continuation #11>
> #<continuation #12>)
>
> Now:
>
>> (##repl-within #11 #f)
> *** STOPPED IN (stdin)@36.2 ---> why is single-stepping now being
> switched on again?
I think this is because continuation #11 calls ##step-handler and the
code you are single stepping is attached to the stepper that you
created in stepper-init, not the one you created in stepper-off. I
think this problem will go away if you mutate the ##main-stepper
vector instead of set!-ing the ##main-stepper variable. (I'm sorry
for the doubt but I'm not sure what you are trying to do).
Marc
More information about the Gambit-list
mailing list