racket/collects/macro-debugger/model/trace.ss
Matthew Flatt 39cedb62ed v3.99.0.2
svn: r7706
2007-11-13 12:40:00 +00:00

72 lines
2.3 KiB
Scheme

(module trace mzscheme
(require (lib "lex.ss" "parser-tools")
(lib "class.ss"))
(require "deriv.ss"
"deriv-parser.ss"
"deriv-tokens.ss"
"reductions.ss"
"hide.ss"
"hiding-policies.ss")
(provide trace-verbose?
trace
trace/result
trace+reductions
current-expand-observe
(all-from "reductions.ss"))
(define current-expand-observe
(dynamic-require ''#%expobs 'current-expand-observe))
(define trace-verbose? (make-parameter #f))
;; trace : syntax -> Derivation
(define (trace stx)
(let-values ([(result tracer) (expand+tracer stx expand)])
(parse-derivation tracer)))
;; trace/result : syntax -> (values syntax/exn Derivation)
(define (trace/result stx)
(let-values ([(result tracer) (expand+tracer stx expand)])
(values result
(parse-derivation tracer))))
;; trace+reductions : syntax -> ReductionSequence
(define (trace+reductions stx)
(reductions (trace stx)))
;; expand+tracer : syntax/sexpr (syntax -> A) -> (values A/exn (-> event))
(define (expand+tracer sexpr expander)
(let* ([events null]
[pos 0])
(define (add! x)
(set! events (cons x events)))
(parameterize ((current-expand-observe
(let ([c 0])
(lambda (sig val)
(set! c (add1 c))
(add! (cons sig val))))))
(let ([result
(with-handlers ([(lambda (exn) #t)
(lambda (exn)
(add! (cons 'error exn))
exn)])
(expander sexpr))])
(add! (cons 'EOF pos))
(values result
(let ([events (reverse events)])
(lambda ()
(define sig+val (car events))
(set! events (cdr events))
(let* ([sig (car sig+val)]
[val (cdr sig+val)]
[t (tokenize sig val pos)])
(when (trace-verbose?)
(printf "~s: ~s~n" pos
(token-name (position-token-token t))))
(set! pos (add1 pos))
t))))))))
)