racket/collects/macro-debugger/view/drscheme-ext.ss
2008-02-05 21:56:49 +00:00

62 lines
2.2 KiB
Scheme

#lang scheme/base
(require scheme/class
scheme/match
scheme/gui
framework/framework
"../model/trace.ss"
"../model/deriv-c.ss"
"../model/deriv-util.ss"
"prefs.ss"
"frame.ss")
(provide macro-stepper-frame%
macro-stepper-config/prefs%
trace/result
show-deriv/orig-parts)
(define macro-stepper-frame%
(macro-stepper-frame-mixin
(frame:standard-menus-mixin
frame:basic%)))
;; show-deriv/orig-parts
;; Strip off mzscheme's #%top-interaction
;; Careful: the #%top-interaction node may be inside of a lift-deriv
(define (show-deriv/orig-parts deriv stepper-promise)
;; adjust-deriv/lift : Derivation -> (list-of Derivation)
(define (adjust-deriv/lift deriv)
(match deriv
[(Wrap lift-deriv (e1 e2 first lifted-stx second))
(let ([first (adjust-deriv/top first)])
(and first
(let ([e1 (wderiv-e1 first)])
(make-lift-deriv e1 e2 first lifted-stx second))))]
[else (adjust-deriv/top deriv)]))
;; adjust-deriv/top : Derivation -> Derivation
(define (adjust-deriv/top deriv)
(if (syntax-source (wderiv-e1 deriv))
deriv
;; It's not original...
;; Strip out mzscheme's top-interactions
;; Keep anything that is a non-mzscheme top-interaction
;; Drop everything else (not original program)
(match deriv
[(Wrap mrule (e1 e2 tx next))
(match tx
[(Wrap transformation (e1 e2 rs ?1 me1 locals ?2 me2 seq))
(cond [(ormap (lambda (x)
(free-identifier=? x #'#%top-interaction))
rs)
;; Just mzscheme's top-interaction; strip it out
(adjust-deriv/top next)]
[(equal? (map syntax-e rs) '(#%top-interaction))
;; A *different* top interaction; keep it
deriv]
[else
;; Not original and not tagged with top-interaction
#f])])]
[else #f])))
(let ([deriv* (adjust-deriv/lift deriv)])
(when deriv* (send (force stepper-promise) add-deriv deriv*))))