62 lines
2.2 KiB
Scheme
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*))))
|