macro-stepper: added module versions of trace, expand/step

original commit: eeb7facdd64db74d4ec90ed870eab6da59c1818b
This commit is contained in:
Ryan Culpepper 2010-11-10 17:45:16 -07:00
parent bd5be74aae
commit dedcef50a2
4 changed files with 50 additions and 37 deletions

View File

@ -28,29 +28,24 @@ syntax browser uses colors and a properties panel to show the term's
syntax properties, such as lexical binding information and source syntax properties, such as lexical binding information and source
location. location.
@section{Macro stepper} @section{Macro stepper}
@defmodule[macro-debugger/stepper] @defmodule[macro-debugger/stepper]
@defproc[(expand/step [stx any/c]) @defproc[(expand/step [stx any/c])
(is-a/c macro-stepper<%>)]{ void?]{
Expands the syntax (or S-expression) and opens a macro stepper frame Expands the syntax (or S-expression) and opens a macro stepper frame
for stepping through the expansion. for stepping through the expansion.
} }
@definterface[macro-stepper<%> ()]{ @defproc[(expand-module/step [mod module-path?])
void?]{
@defmethod[(at-start?) boolean?] Expands the source file named by @racket[mod], which must contains a
@defmethod[(at-end?) boolean?] single module declaration, and opens a macro stepper frame for
@defmethod[(navigate-to-start) void?] stepping through the expansion.
@defmethod[(navigate-to-end) void?]
@defmethod[(navigate-previous) void?]
@defmethod[(navigate-next) void?]
@defmethod[(at-top?) boolean?]
@defmethod[(at-bottom?) boolean?]
@defmethod[(navigate-up) void?]
@defmethod[(navigate-down) void?]
} }
@section{Macro expansion tools} @section{Macro expansion tools}
@ -139,7 +134,6 @@ transformer returns. Unmarking is suppressed if @scheme[unmark?] is
] ]
(Run the fragment above in the macro stepper.) (Run the fragment above in the macro stepper.)
} }
@defproc[(emit-local-step [before syntax?] [after syntax?] @defproc[(emit-local-step [before syntax?] [after syntax?]
@ -151,9 +145,9 @@ Emits an event that simulates a local expansion step from
The @scheme[id] argument acts as the step's ``macro'' for the purposes The @scheme[id] argument acts as the step's ``macro'' for the purposes
of macro hiding. of macro hiding.
} }
@section{Macro stepper text interface} @section{Macro stepper text interface}
@defmodule[macro-debugger/stepper-text] @defmodule[macro-debugger/stepper-text]
@ -188,6 +182,7 @@ of macro hiding.
@scheme['all] to print out all remaining steps. @scheme['all] to print out all remaining steps.
} }
@section{Syntax browser} @section{Syntax browser}
@defmodule[macro-debugger/syntax-browser] @defmodule[macro-debugger/syntax-browser]
@ -208,14 +203,6 @@ of macro hiding.
objects. objects.
} }
@;{
@defproc[(syntax-snip [stx syntax?])
(is-a/c snip%)]{
Like @scheme[browse-syntax], but creates a snip that can be
displayed in an editor.
}
}
@section{Using the macro stepper} @section{Using the macro stepper}

View File

@ -1,11 +1,15 @@
#lang racket/base #lang racket/base
(require racket/promise (require racket/promise
syntax/modcode
syntax/modresolve
parser-tools/lex parser-tools/lex
"deriv-parser.rkt" "deriv-parser.rkt"
"deriv-tokens.rkt") "deriv-tokens.rkt")
(provide trace (provide trace
trace* trace*
trace-module
trace*-module
trace/result trace/result
trace-verbose? trace-verbose?
events->token-generator events->token-generator
@ -25,6 +29,11 @@
(let-values ([(result events derivp) (trace* stx expander)]) (let-values ([(result events derivp) (trace* stx expander)])
(force derivp))) (force derivp)))
;; trace-module : module-path -> Deriv
(define (trace-module module-path)
(let-values ([(result events derivp) (trace*-module module-path)])
(force derivp)))
;; trace/result : stx -> stx/exn Deriv ;; trace/result : stx -> stx/exn Deriv
(define (trace/result stx [expander expand/compile-time-evals]) (define (trace/result stx [expander expand/compile-time-evals])
(let-values ([(result events derivp) (trace* stx expander)]) (let-values ([(result events derivp) (trace* stx expander)])
@ -39,6 +48,13 @@
(delay (parse-derivation (delay (parse-derivation
(events->token-generator events)))))) (events->token-generator events))))))
;; trace*-module : module-path -> stx/exn (listof event) (promiseof Deriv)
(define (trace*-module module-path)
(get-module-code (resolve-module-path module-path #f)
#:choose (lambda _ 'src)
#:compile (lambda (stx)
(trace* stx expand))))
;; events->token-generator : (list-of event) -> (-> token) ;; events->token-generator : (list-of event) -> (-> token)
(define (events->token-generator events) (define (events->token-generator events)
(let ([pos 1]) (let ([pos 1])

View File

@ -1,6 +1,25 @@
#lang racket/base #lang racket/base
(require "view/view.rkt") (require racket/class
(provide expand/step) racket/contract
unstable/class-iop
"model/trace.rkt"
"view/interfaces.rkt"
"view/view.rkt")
(define (create-stepper deriv)
(define director (new macro-stepper-director%))
(define stepper (send/i director director<%> new-stepper))
(send/i director director<%> add-deriv deriv)
(void))
(define (expand/step stx) (define (expand/step stx)
(go stx)) (create-stepper (trace stx)))
(define (expand-module/step module-path)
(create-stepper (trace-module module-path)))
(provide/contract
[expand/step
(-> syntax? void?)]
[expand-module/step
(-> module-path? void?)])

View File

@ -9,8 +9,7 @@
"prefs.rkt" "prefs.rkt"
"../model/trace.rkt") "../model/trace.rkt")
(provide macro-stepper-director% (provide macro-stepper-director%
macro-stepper-frame% macro-stepper-frame%)
go)
(define macro-stepper-director% (define macro-stepper-director%
(class* object% (director<%>) (class* object% (director<%>)
@ -61,11 +60,3 @@
(macro-stepper-frame-mixin (macro-stepper-frame-mixin
(frame:standard-menus-mixin (frame:standard-menus-mixin
(frame:basic-mixin frame%)))) (frame:basic-mixin frame%))))
;; Main entry points
(define (go stx)
(define director (new macro-stepper-director%))
(define stepper (send/i director director<%> new-stepper))
(send/i director director<%> add-deriv (trace stx))
(void))