In Common Lisp you have to use construction like (restart-case (/ 1 x) (use-value (value) "" value))
or cerror or something like that. I don't see, what prevents Racket to do the same: restart-case capture continuations and handler-case, handler-bind or debugger choose the continuation. Something like: (define (test l) (if (null? l) '() (cons (let/cc k (with-handlers ([exn? (λ (v) (raise (cons v k)))]) (/ 1 (car l)))) (test (cdr l))))) Then debugger can catch the continuation and call (k new-value). Четверг, 27 июня 2013, 13:32 -06:00 от Matthew Flatt <mfl...@cs.utah.edu>: >At Thu, 27 Jun 2013 12:35:10 -0400, Sean Kanaley wrote: >> As a more general solution to this kind of interactive debugging issue, >> how difficult would implementing a typical Common Lisp REPL be? I'm >> thinking of adding the kind of error/condition handler like: >> >> "<error or condition goes here> >> >> enter a number: >> >> 0 - enter new value >> 1 - exit to top level >> 2 - exit one level >> 3 - print stack trace >> 4 - etc. >> >> I'm not familiar with Racket's internals so I don't know how much this >> is a REPL hack vs. rewriting the whole system (the condition system >> isn't necessary)... If it's not too impossible I would be happy to make >> this contribution... > >Racket's implementation (and maybe to some degree, I think, its design) >does not support restartable exceptions, except in the case of the >`exn:break' exception. So, option 0 would be difficult or impossible to >implement as a hook into the run-time system. > >A debugger could instrument programs to allow this kind of restart by >wrapping every expression with a prompt, but I think that would be >fairly expensive in the current implementation. > >____________________ > Racket Users list: > http://lists.racket-lang.org/users -- Roman Klochkov
____________________ Racket Users list: http://lists.racket-lang.org/users