diff --git a/collects/macro-debugger/analysis/check-requires.rkt b/collects/macro-debugger/analysis/check-requires.rkt
index 95d2232..caf86bd 100644
--- a/collects/macro-debugger/analysis/check-requires.rkt
+++ b/collects/macro-debugger/analysis/check-requires.rkt
@@ -116,6 +116,9 @@ The limitations:
(if (list? arg)
(apply recur arg)
(analyze arg refs))))
+ (define (recur/phase-up . args)
+ (parameterize ((phase (add1 (phase))))
+ (apply recur args)))
(define (add! ids)
(reftable-add-all! refs (phase) ids))
@@ -147,8 +150,7 @@ The limitations:
[(local-exn exn)
(void)]
[(local-expansion z1 z2 for-stx? me1 inner lifted me2 opaque)
- (parameterize ((phase (+ (phase) (if for-stx? 1 0))))
- (recur inner))]
+ ((if for-stx? recur/phase-up recur) inner)]
[(local-lift expr ids)
(void)]
[(local-lift-end decl)
@@ -171,13 +173,16 @@ The limitations:
(void)]
[(p:module z1 z2 rs ?1 locals tag rename check tag2 ?3 body shift)
(recur locals check body)]
- [(p:#%module-begin z1 z2 rs ?1 me pass1 pass2 ?2)
- (recur pass1 pass2)]
- [(p:define-syntaxes z1 z2 rs ?1 rhs locals)
- (parameterize ((phase (+ (phase) 1)))
- (recur rhs locals))]
+ [(p:#%module-begin z1 z2 rs ?1 me body ?2)
+ (recur body)]
+ [(p:define-syntaxes z1 z2 rs ?1 prep rhs locals)
+ (recur prep locals)
+ (recur/phase-up rhs)]
[(p:define-values z1 z2 rs ?1 rhs)
(recur rhs)]
+ [(p:begin-for-syntax z1 z2 rs ?1 prep body)
+ (recur prep)
+ (recur/phase-up body)]
[(p:#%expression z1 z2 rs ?1 inner untag)
(recur inner)]
@@ -205,8 +210,8 @@ The limitations:
(recur rhss body)]
[(p:letrec-values _ _ _ _ renames rhss body)
(recur rhss body)]
- [(p:letrec-syntaxes+values _ _ _ _ srenames sbindrhss vrenames vrhss body tag)
- (recur sbindrhss vrhss body)]
+ [(p:letrec-syntaxes+values _ _ _ _ srenames prep sbindrhss vrenames vrhss body tag)
+ (recur prep sbindrhss vrhss body)]
[(p:provide _ _ _ _ inners ?2)
(recur inners)]
@@ -226,7 +231,6 @@ The limitations:
[(p:quote-syntax z1 z2 _ _)
(when z2 (analyze/quote-syntax z2 refs))]
[(p:#%variable-reference _ _ _ _)
- ;; FIXME
(void)]
[(lderiv _ _ ?1 derivs)
@@ -243,16 +247,19 @@ The limitations:
(recur head)]
[(b:defvals _ head ?1 rename ?2)
(recur head)]
- [(b:defstx _ head ?1 rename ?2 bindrhs)
- (recur head bindrhs)]
+ [(b:defstx _ head ?1 rename ?2 prep bindrhs)
+ (recur head prep bindrhs)]
[(bind-syntaxes rhs locals)
- (parameterize ((phase (+ 1 (phase))))
- (recur rhs locals))]
+ (recur/phase-up rhs)
+ (recur locals)]
[(clc ?1 renames body)
(recur body)]
+ [(module-begin/phase pass1 pass2 pass3)
+ (recur pass1 pass2 pass3)]
+
[(mod:prim head rename prim)
(recur head prim)]
[(mod:splice head rename ?1 tail)
@@ -266,8 +273,12 @@ The limitations:
[(mod:skip)
(void)]
+ ;; Shouldn't occur in module expansion.
+ ;; (Unless code calls 'expand' at compile-time; weird, but possible.)
[(ecte _ _ locals first second locals2)
(recur locals first second locals2)]
+ [(bfs:lift lderiv lifts)
+ (recur lderiv)]
[#f
(void)]))
diff --git a/collects/macro-debugger/analysis/private/moduledb.rkt b/collects/macro-debugger/analysis/private/moduledb.rkt
index 6ce302e..a15d84a 100644
--- a/collects/macro-debugger/analysis/private/moduledb.rkt
+++ b/collects/macro-debugger/analysis/private/moduledb.rkt
@@ -21,7 +21,7 @@
[racket/match no-bypass]
['#%builtin no-drop]
- [typed-scheme/private/base-env no-drop]
- [typed-scheme/private/base-special-env no-drop]
- [typed-scheme/private/base-env-numeric no-drop]
- [typed-scheme/private/base-env-indexing no-drop])))
+ [typed-racket/private/base-env no-drop]
+ [typed-racket/private/base-special-env no-drop]
+ [typed-racket/private/base-env-numeric no-drop]
+ [typed-racket/private/base-env-indexing no-drop])))
diff --git a/collects/macro-debugger/model/deriv-c.rkt b/collects/macro-debugger/model/deriv-c.rkt
index 7d14214..57b191d 100644
--- a/collects/macro-debugger/model/deriv-c.rkt
+++ b/collects/macro-debugger/model/deriv-c.rkt
@@ -1,6 +1,8 @@
#lang racket/base
(provide (all-defined-out))
+;; PrepareExpEnv = (listof LocalAction)
+
;; A Node(a) is:
;; (make-node a ?a)
(define-struct node (z1 z2) #:transparent)
@@ -48,15 +50,15 @@
(define-struct (prule base) () #:transparent)
(define-struct (p:variable prule) () #:transparent)
-;; (make-p:module (listof LocalAction) ?stx stx ?Deriv ?stx ?exn Deriv ?stx)
-;; (make-p:#%module-begin Stx ModulePass1 ModulePass2 ?exn)
-(define-struct (p:module prule) (locals tag rename check tag2 ?3 body shift)
+;; (make-p:module PrepareEnv ?stx stx ?Deriv ?stx ?exn Deriv ?stx)
+;; (make-p:#%module-begin Stx ModuleBegin/Phase ?exn)
+(define-struct (p:module prule) (prep tag rename check tag2 ?3 body shift)
#:transparent)
-(define-struct (p:#%module-begin prule) (me pass1 pass2 ?2) #:transparent)
+(define-struct (p:#%module-begin prule) (me body ?2) #:transparent)
-;; (make-p:define-syntaxes DerivLL (listof LocalAction))
+;; (make-p:define-syntaxes (listof LocalAction) DerivLL (listof LocalAction))
;; (make-p:define-values Deriv)
-(define-struct (p:define-syntaxes prule) (rhs locals) #:transparent)
+(define-struct (p:define-syntaxes prule) (prep rhs locals) #:transparent)
(define-struct (p:define-values prule) (rhs) #:transparent)
;; (make-p:#%expression Deriv ?Stx)
@@ -81,13 +83,14 @@
;; (make-p:case-lambda (list-of CaseLambdaClause))
;; (make-p:let-values LetRenames (list-of Deriv) BDeriv)
;; (make-p:letrec-values LetRenames (list-of Deriv) BDeriv)
-;; (make-p:letrec-syntaxes+values LSVRenames (list-of BindSyntaxes) (list-of Deriv) BDeriv ?Stx)
+;; (make-p:letrec-syntaxes+values LSVRenames PrepareExpEnv
+;; (list-of BindSyntaxes) (list-of Deriv) BDeriv ?Stx)
(define-struct (p:lambda prule) (renames body) #:transparent)
(define-struct (p:case-lambda prule) (renames+bodies) #:transparent)
(define-struct (p:let-values prule) (renames rhss body) #:transparent)
(define-struct (p:letrec-values prule) (renames rhss body) #:transparent)
(define-struct (p:letrec-syntaxes+values prule)
- (srenames sbindrhss vrenames vrhss body tag)
+ (srenames prep sbindrhss vrenames vrhss body tag)
#:transparent)
;; (make-p:provide (listof Deriv) ?exn)
@@ -99,6 +102,12 @@
;; (make-p:#%stratified-body BDeriv)
(define-struct (p:#%stratified-body prule) (bderiv) #:transparent)
+;; (make-p:begin-for-syntax (listof LocalAction) BFSBody)
+;; where BFSBody is one of
+;; - ModuleBegin/Phase
+;; - (list BeginForSyntaxLifts ... LDeriv))
+(define-struct (p:begin-for-syntax prule) (prep body) #:transparent)
+
;; (make-p:stop )
;; (make-p:unknown )
;; (make-p:#%top Stx)
@@ -129,13 +138,13 @@
;; (make-b:expr BlockRenames Deriv)
;; (make-b:splice BlockRenames Deriv ?exn Stxs ?exn)
;; (make-b:defvals BlockRenames Deriv ?exn Stx ?exn)
-;; (make-b:defstx BlockRenames Deriv ?exn Stx ?exn BindSyntaxes)
+;; (make-b:defstx BlockRenames Deriv ?exn Stx ?exn PrepareExpEnv BindSyntaxes)
(define-struct b:error (?1) #:transparent)
(define-struct brule (renames) #:transparent)
(define-struct (b:expr brule) (head) #:transparent)
(define-struct (b:splice brule) (head ?1 tail ?2) #:transparent)
(define-struct (b:defvals brule) (head ?1 rename ?2) #:transparent)
-(define-struct (b:defstx brule) (head ?1 rename ?2 bindrhs) #:transparent)
+(define-struct (b:defstx brule) (head ?1 rename ?2 prep bindrhs) #:transparent)
;; A BindSyntaxes is
;; (make-bind-syntaxes DerivLL (listof LocalAction))
@@ -147,8 +156,16 @@
;; A BlockRename is (cons Stx Stx)
+;; A BeginForSyntaxLifts is
+;; (make-bfs:lift LDeriv (listof stx))
+(define-struct bfs:lift (lderiv lifts) #:transparent)
+
+;; A ModuleBegin/Phase is (module-begin/phase ModulePass1 ModulePass2 ModulePass3)
+(define-struct module-begin/phase (pass1 pass2 pass3) #:transparent)
+
;; A ModPass1 is (list-of ModRule1)
;; A ModPass2 is (list-of ModRule2)
+;; A ModPass3 is (list-of p:provide)
;; A ModRule1 is one of
;; (make-mod:prim Deriv Stx ModPrim)
@@ -167,12 +184,12 @@
(define-struct (mod:cons modrule) (head) #:transparent)
(define-struct (mod:skip modrule) () #:transparent)
-;; A ModPrim is a PRule in:
-;; (make-p:define-values #:transparent)
-;; (make-p:define-syntaxes Deriv)
-;; (make-p:require (listof LocalAction))
-;; (make-p:provide )
-;; #f
+;; A ModPrim is either #f or one of the following PRule variants:
+;; - p:define-values
+;; - p:define-syntaxes
+;; - p:begin-for-syntax
+;; - p:require
+;; - p:provide
;; ECTE represents expand/compile-time-evals
diff --git a/collects/macro-debugger/model/deriv-parser.rkt b/collects/macro-debugger/model/deriv-parser.rkt
index afa8791..b47503a 100644
--- a/collects/macro-debugger/model/deriv-parser.rkt
+++ b/collects/macro-debugger/model/deriv-parser.rkt
@@ -28,9 +28,9 @@
(parser
(options (start Expansion)
(src-pos)
- (tokens basic-tokens prim-tokens renames-tokens)
+ (tokens basic-empty-tokens basic-tokens prim-tokens renames-tokens)
(end EOF)
- #|(debug "/tmp/ryan/DEBUG-PARSER.txt")|#
+ (debug "/tmp/ryan/DEBUG-PARSER.txt")
(error deriv-error))
;; tokens
@@ -55,7 +55,8 @@
tag
IMPOSSIBLE
start
- top-non-begin)
+ top-non-begin
+ prepare-env)
;; Entry point
(productions
@@ -119,6 +120,10 @@
(Eval
[((? LocalActions)) $1])
+ ;; Prepare env for compilation
+ (PrepareEnv
+ [(prepare-env (? Eval)) $2])
+
;; Expansion of an expression to primitive form
(CheckImmediateMacro
[(enter-check (? CheckImmediateMacro/Inner) exit-check)
@@ -198,9 +203,9 @@
(make local-lift-require (car $1) (cadr $1) (cddr $1))]
[(lift-provide)
(make local-lift-provide $1)]
- [(local-bind ! rename-list)
+ [(local-bind ! rename-list next)
(make local-bind $1 $2 $3 #f)]
- [(local-bind rename-list (? BindSyntaxes))
+ [(local-bind rename-list (? BindSyntaxes) next)
(make local-bind $1 #f $2 $3)]
[(track-origin)
(make track-origin (car $1) (cdr $1))]
@@ -266,14 +271,15 @@
[((? PrimRequire)) ($1 e1 e2 rs)]
[((? PrimProvide)) ($1 e1 e2 rs)]
[((? PrimVarRef)) ($1 e1 e2 rs)]
- [((? PrimStratifiedBody)) ($1 e1 e2 rs)])
+ [((? PrimStratifiedBody)) ($1 e1 e2 rs)]
+ [((? PrimBeginForSyntax)) ($1 e1 e2 rs)])
(PrimModule
(#:args e1 e2 rs)
- [(prim-module ! next (? Eval) OptTag rename-one
+ [(prim-module ! (? PrepareEnv) OptTag rename-one
(? OptCheckImmediateMacro) OptTag !
(? EE) rename-one)
- (make p:module e1 e2 rs $2 $4 $5 $6 $7 $8 $9 $10 $11)])
+ (make p:module e1 e2 rs $2 $3 $4 $5 $6 $7 $8 $9 $10)])
(OptTag
[() #f]
[(tag) $1])
@@ -283,9 +289,12 @@
(Prim#%ModuleBegin
(#:args e1 e2 rs)
- [(prim-#%module-begin ! rename-one
- (? ModulePass1) next-group (? ModulePass2) !)
- (make p:#%module-begin e1 e2 rs $2 $3 $4 $6 $7)])
+ [(prim-#%module-begin ! rename-one (? ModuleBegin/Phase) !)
+ (make p:#%module-begin e1 e2 rs $2 $3 $4 $5)])
+
+ (ModuleBegin/Phase
+ [((? ModulePass1) next-group (? ModulePass2) next-group (? ModulePass3))
+ (make module-begin/phase $1 $3 $5)])
(ModulePass1
(#:skipped null)
@@ -307,17 +316,12 @@
(#:args e1)
[(enter-prim prim-define-values ! exit-prim)
(make p:define-values $1 $4 null $3 #f)]
- [(enter-prim prim-define-syntaxes (? Eval)
+ [(enter-prim prim-define-syntaxes ! (? PrepareEnv)
phase-up (? EE/LetLifts) (? Eval) exit-prim)
- ;; FIXME: define-syntax can trigger instantiation of phase-1 code from other
- ;; modules. Ideally, should have [ ... prim-define-syntaxes ! (? Eval) ... ]
- ;; but gives shift/reduce conflict.
- ;; One solution: add 'next marker between form check and phase-1 init.
- ;; Also search for other places where phase-1 init can happen.
- (let ([$3
- (for/or ([local-action (in-list $3)])
- (and (local-exn? local-action) (local-exn-exn local-action)))])
- (make p:define-syntaxes $1 $7 null $3 $5 $6))]
+ (make p:define-syntaxes $1 $8 null $3 $4 $6 $7)]
+ [(enter-prim prim-begin-for-syntax ! (? PrepareEnv)
+ phase-up (? ModuleBegin/Phase) exit-prim)
+ (make p:begin-for-syntax $1 $7 null $3 $4 $6)]
[(enter-prim prim-require (? Eval) exit-prim)
(make p:require $1 $4 null #f $3)]
[()
@@ -335,9 +339,6 @@
;; not normal; already handled
[()
(make mod:skip)]
- ;; provide: special
- [(enter-prim prim-provide (? ModuleProvide/Inner) ! exit-prim)
- (make mod:cons (make p:provide $1 $5 null #f $3 $4))]
;; normal: expand completely
[((? EE))
(make mod:cons $1)]
@@ -345,6 +346,16 @@
[(EE module-lift-loop)
(make mod:lift $1 #f $2)])
+ (ModulePass3
+ (#:skipped null)
+ [() null]
+ [((? ModulePass3-Part) (? ModulePass3))
+ (cons $1 $2)])
+
+ (ModulePass3-Part
+ [(enter-prim prim-provide (? ModuleProvide/Inner) ! exit-prim)
+ (make p:provide $1 $5 null #f $3 $4)])
+
(ModuleProvide/Inner
(#:skipped null)
[() null]
@@ -354,8 +365,8 @@
;; Definitions
(PrimDefineSyntaxes
(#:args e1 e2 rs)
- [(prim-define-syntaxes ! (? EE/LetLifts) (? Eval))
- (make p:define-syntaxes e1 e2 rs $2 $3 $4)])
+ [(prim-define-syntaxes ! (? PrepareEnv) (? EE/LetLifts) (? Eval))
+ (make p:define-syntaxes e1 e2 rs $2 $3 $4 $5)])
(PrimDefineValues
(#:args e1 e2 rs)
@@ -444,13 +455,13 @@
(PrimLetrecSyntaxes+Values
(#:args e1 e2 rs)
[(prim-letrec-syntaxes+values ! renames-letrec-syntaxes
- (? NextBindSyntaxess) next-group (? EB) OptTag)
- (make p:letrec-syntaxes+values e1 e2 rs $2 $3 $4 #f null $6 $7)]
- [(prim-letrec-syntaxes+values renames-letrec-syntaxes
- NextBindSyntaxess next-group
+ (? PrepareEnv) (? NextBindSyntaxess) next-group (? EB) OptTag)
+ (make p:letrec-syntaxes+values e1 e2 rs $2 $3 $4 $5 #f null $7 $8)]
+ [(prim-letrec-syntaxes+values renames-letrec-syntaxes
+ PrepareEnv NextBindSyntaxess next-group
prim-letrec-values
renames-let (? NextEEs) next-group (? EB) OptTag)
- (make p:letrec-syntaxes+values e1 e2 rs #f $2 $3 $6 $7 $9 $10)])
+ (make p:letrec-syntaxes+values e1 e2 rs #f $2 $3 $4 $7 $8 $10 $11)])
;; Atomic expressions
(Prim#%Datum
@@ -490,6 +501,16 @@
(#:args e1 e2 rs)
[(prim-#%stratified-body ! (? EB)) (make p:#%stratified-body e1 e2 rs $2 $3)])
+ (PrimBeginForSyntax
+ (#:args e1 e2 rs)
+ [(prim-begin-for-syntax ! (? PrepareEnv) (? BeginForSyntax*))
+ (make p:begin-for-syntax e1 e2 rs $2 $3 $4)])
+ (BeginForSyntax*
+ [((? EL))
+ (list $1)]
+ [(EL module-lift-loop (? BeginForSyntax*))
+ (cons (make bfs:lift $1 $2) $3)])
+
(PrimSet
(#:args e1 e2 rs)
;; Unrolled to avoid shift/reduce
@@ -526,8 +547,8 @@
[(next renames-block CheckImmediateMacro prim-define-values ! rename-one !)
(make b:defvals $2 $3 $5 $6 $7)]
[(next renames-block CheckImmediateMacro
- prim-define-syntaxes ! rename-one ! (? BindSyntaxes))
- (make b:defstx $2 $3 $5 $6 $7 $8)])
+ prim-define-syntaxes ! rename-one ! (? PrepareEnv) (? BindSyntaxes))
+ (make b:defstx $2 $3 $5 $6 $7 $8 $9)])
;; BindSyntaxes Answer = Derivation
(BindSyntaxes
diff --git a/collects/macro-debugger/model/deriv-tokens.rkt b/collects/macro-debugger/model/deriv-tokens.rkt
index 7e717e7..9a67823 100644
--- a/collects/macro-debugger/model/deriv-tokens.rkt
+++ b/collects/macro-debugger/model/deriv-tokens.rkt
@@ -3,12 +3,24 @@
"deriv.rkt")
(provide (all-defined-out))
-(define-tokens basic-tokens
+(define-tokens basic-empty-tokens
(start ; .
- visit ; syntax
- resolve ; identifier
next ; .
next-group ; .
+ phase-up ; .
+ ... ; .
+ EOF ; .
+ enter-bind ; .
+ exit-bind ; .
+ IMPOSSIBLE ; useful for error-handling clauses that have no
+ ; NoError counterpart
+ top-non-begin ; .
+ prepare-env ; .
+ ))
+
+(define-tokens basic-tokens
+ (visit ; syntax
+ resolve ; identifier
enter-macro ; syntax
macro-pre-transform ; syntax
macro-post-transform ; syntax
@@ -24,10 +36,7 @@
exit-list ; syntaxes
enter-check ; syntax
exit-check ; syntax
- phase-up ; .
module-body ; (list-of (cons syntax boolean))
- ... ; .
- EOF ; .
syntax-error ; exn
lift-loop ; syntax = new form (let or begin; let if for_stx)
lift/let-loop ; syntax = new let form
@@ -44,8 +53,6 @@
exit-local ; syntax
local-bind ; (listof identifier)
- enter-bind ; .
- exit-bind ; .
opaque ; opaque-syntax
variable ; (cons identifier identifier)
@@ -54,10 +61,7 @@
rename-one ; syntax
rename-list ; (list-of syntax)
- IMPOSSIBLE ; useful for error-handling clauses that have no NoError counterpart
-
top-begin ; identifier
- top-non-begin ; .
local-remark ; (listof (U string syntax))
local-artificial-step ; (list syntax syntax syntax syntax)
@@ -88,6 +92,7 @@
prim-expression
prim-varref
prim-#%stratified-body
+ prim-begin-for-syntax
))
;; ** Signals to tokens
@@ -182,7 +187,9 @@
(152 track-origin ,token-track-origin)
(153 local-value ,token-local-value)
(154 local-value-result ,token-local-value-result)
- (155 prim-#%stratified-body)))
+ (155 prim-#%stratified-body)
+ (156 prim-begin-for-syntax)
+ (157 prepare-env)))
(define (signal->symbol sig)
(if (symbol? sig)
diff --git a/collects/macro-debugger/model/reductions.rkt b/collects/macro-debugger/model/reductions.rkt
index 92f5b63..ec2a2df 100644
--- a/collects/macro-debugger/model/reductions.rkt
+++ b/collects/macro-debugger/model/reductions.rkt
@@ -76,11 +76,11 @@
[#:when (or (not (identifier? e1))
(not (bound-identifier=? e1 e2)))
[#:walk e2 'resolve-variable]])]
- [(Wrap p:module (e1 e2 rs ?1 locals tag rename check tag2 ?3 body shift))
+ [(Wrap p:module (e1 e2 rs ?1 prep tag rename check tag2 ?3 body shift))
(R [#:hide-check rs]
[! ?1]
[#:pattern ?form]
- [LocalActions ?form locals]
+ [PrepareEnv ?form prep]
[#:pattern (?module ?name ?language . ?body-parts)]
[#:when tag
[#:in-hole ?body-parts
@@ -98,19 +98,17 @@
[Expr ?body body]
[#:pattern ?form]
[#:rename ?form shift])]
- [(Wrap p:#%module-begin (e1 e2 rs ?1 me pass1 pass2 ?2))
+ [(Wrap p:#%module-begin (e1 e2 rs ?1 me body ?2))
(R [! ?1]
[#:pattern ?form]
[#:rename ?form me]
[#:pattern (?module-begin . ?forms)]
- [#:pass1]
- [ModulePass ?forms pass1]
- [#:pass2]
- [#:do (DEBUG (printf "** module begin pass 2\n"))]
- [ModulePass ?forms pass2]
- [! ?1])]
- [(Wrap p:define-syntaxes (e1 e2 rs ?1 rhs locals))
+ [ModuleBegin/Phase ?forms body]
+ [! ?2])]
+ [(Wrap p:define-syntaxes (e1 e2 rs ?1 prep rhs locals))
(R [! ?1]
+ [#:pattern ?form]
+ [PrepareEnv ?form prep]
[#:pattern (?define-syntaxes ?vars ?rhs)]
[#:binders #'?vars]
[Expr/PhaseUp ?rhs rhs]
@@ -191,8 +189,10 @@
[Expr (?rhs ...) rhss]
[Block ?body body])]
[(Wrap p:letrec-syntaxes+values
- (e1 e2 rs ?1 srenames srhss vrenames vrhss body tag))
+ (e1 e2 rs ?1 srenames prep srhss vrenames vrhss body tag))
(R [! ?1]
+ [#:pattern ?form]
+ [PrepareEnv ?form prep]
[#:pass1]
[#:pattern (?lsv ([?svars ?srhs] ...) ([?vvars ?vrhs] ...) . ?body)]
[#:rename (((?svars ?srhs) ...) ((?vvars ?vrhs) ...) . ?body)
@@ -271,6 +271,16 @@
[! ?2]
[Expr ?rhs rhs])]
+ [(Wrap p:begin-for-syntax (e1 e2 rs ?1 prep body))
+ (R [! ?1]
+ [#:pattern ?form]
+ [PrepareEnv ?form prep]
+ [#:pattern (?bfs . ?forms)]
+ [#:parameterize ((phase (add1 (phase))))
+ [#:if (module-begin/phase? body)
+ [[ModuleBegin/Phase ?forms body]]
+ [[BeginForSyntax ?forms body]]]])]
+
;; Macros
[(Wrap mrule (e1 e2 rs ?1 me1 locals me2 ?2 etx next))
(R [! ?1]
@@ -378,6 +388,9 @@
[Block ?body body]
[CaseLambdaClauses ?rest rest])]))
+(define (PrepareEnv prep)
+ (LocalActions prep))
+
;; local-actions-reductions
(define (LocalActions locals)
(match locals
@@ -556,7 +569,7 @@
[#:pass2]
[#:pattern (?first . ?rest)]
[BlockPass ?rest rest])]
- [(cons (Wrap b:defstx (renames head ?1 rename ?2 bindrhs)) rest)
+ [(cons (Wrap b:defstx (renames head ?1 rename ?2 prep bindrhs)) rest)
(R [#:pattern (?first . ?rest)]
[#:rename/no-step ?first (car renames) (cdr renames)]
[#:pass1]
@@ -567,6 +580,8 @@
[#:binders #'?vars]
[! ?2]
[#:pass2]
+ [#:pattern ?form]
+ [PrepareEnv ?form prep]
[#:pattern ((?define-syntaxes ?vars ?rhs) . ?rest)]
[BindSyntaxes ?rhs bindrhs]
[#:pattern (?first . ?rest)]
@@ -587,6 +602,42 @@
[Expr/PhaseUp ?form rhs]
[LocalActions ?form locals])]))
+(define (BeginForSyntax passes)
+ ;; Note: an lderiv doesn't necessarily cover all stxs, due to lifting.
+ (match/count passes
+ [(cons (? lderiv? lderiv) '())
+ (R [#:pattern ?forms]
+ [List ?forms lderiv])]
+ [(cons (Wrap bfs:lift (lderiv stxs)) rest)
+ (R [#:pattern LDERIV]
+ [#:parameterize ((available-lift-stxs (reverse stxs))
+ (visible-lift-stxs null))
+ [#:pass1]
+ [List LDERIV lderiv]
+ [#:do (when (pair? (available-lift-stxs))
+ (lift-error 'bfs:lift "available lifts left over"))]
+ [#:let visible-lifts (visible-lift-stxs)]
+ [#:pattern ?forms]
+ [#:pass2]
+ [#:let old-forms #'?forms]
+ [#:left-foot null]
+ [#:set-syntax (append visible-lifts old-forms)]
+ [#:step 'splice-lifts visible-lifts]
+ [#:set-syntax (append stxs old-forms)]
+ [BeginForSyntax ?forms rest]])]))
+
+(define (ModuleBegin/Phase body)
+ (match/count body
+ [(Wrap module-begin/phase (pass1 pass2 pass3))
+ (R [#:pass1]
+ [#:pattern ?forms]
+ [ModulePass ?forms pass1]
+ [#:pass2]
+ [#:do (DEBUG (printf "** module begin pass 2\n"))]
+ [ModulePass ?forms pass2]
+ ;; ignore pass3 for now: only provides
+ )]))
+
;; ModulePass : (list-of MBRule) -> RST
(define (ModulePass mbrules)
(match/count mbrules
diff --git a/collects/macro-debugger/model/trace.rkt b/collects/macro-debugger/model/trace.rkt
index 527494b..db358c3 100644
--- a/collects/macro-debugger/model/trace.rkt
+++ b/collects/macro-debugger/model/trace.rkt
@@ -152,7 +152,7 @@
(eval/compile stx)]
[(define-syntaxes . _)
(eval/compile stx)]
- [(define-values-for-syntax . _)
+ [(begin-for-syntax . _)
(eval/compile stx)]
[(define-values (id ...) . _)
(with-syntax ([defvals (stx-car stx)]