macro-stepper: added module versions of trace, expand/step
original commit: eeb7facdd64db74d4ec90ed870eab6da59c1818b
This commit is contained in:
parent
bd5be74aae
commit
dedcef50a2
|
@ -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}
|
||||||
|
|
||||||
|
|
|
@ -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])
|
||||||
|
|
|
@ -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?)])
|
||||||
|
|
|
@ -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))
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user