deriv-c.rkt (8140B)
1 #lang racket/base 2 (provide (all-defined-out)) 3 4 ;; PrepareExpEnv = (listof LocalAction) 5 6 ;; A Node(a) is: 7 ;; (make-node a ?a) 8 (define-struct node (z1 z2) #:transparent) 9 10 ;; A TopDeriv is one of 11 ;; (make-lift-deriv <Node(Stx)> Deriv Stxs TopDeriv) 12 ;; Deriv 13 14 ;; A Deriv is one of 15 ;; MRule 16 ;; PrimDeriv 17 18 ;; Base = << Node(Stx) Rs ?exn >> 19 20 (define-struct (deriv node) () #:transparent) 21 (define-struct (base deriv) (resolves ?1) #:transparent) 22 23 (define-struct (lift-deriv deriv) (first lift-stx second) #:transparent) 24 (define-struct (tagrule deriv) (tagged-stx next) #:transparent) 25 26 ;; A DerivLL is one of 27 ;; (make-lift/let-deriv <Node(Stx)> Deriv Stx Deriv) 28 ;; Deriv 29 (define-struct (lift/let-deriv deriv) (first lift-stx second) #:transparent) 30 31 ;; A MRule is 32 ;; (make-mrule <Base(Stx)> ?Stx (listof LocalAction) ?exn ?Stx ?Deriv) 33 (define-struct (mrule base) (me1 locals me2 ?2 etx next) #:transparent) 34 35 ;; A LocalAction is one of: 36 (define-struct local-exn (exn) #:transparent) 37 (define-struct (local-expansion node) (for-stx? me1 inner lifted me2 opaque) 38 #:transparent) 39 (define-struct local-lift (expr ids) #:transparent) 40 (define-struct local-lift-end (decl) #:transparent) 41 (define-struct local-lift-require (req expr mexpr) #:transparent) 42 (define-struct local-lift-provide (prov) #:transparent) 43 (define-struct local-bind (names ?1 renames bindrhs) #:transparent) 44 (define-struct local-value (name ?1 resolves bound? binding) #:transparent) 45 ;; binding is saved (identifier-binding name) at time of lookup, since it may change 46 ;; if name is rebound in definition context 47 (define-struct track-origin (before after) #:transparent) 48 (define-struct local-remark (contents) #:transparent) 49 ;; contents : (listof (U string syntax)) 50 (define-struct local-mess (events) #:transparent) 51 52 ;; A PrimDeriv is one of 53 (define-struct (prule base) () #:transparent) 54 (define-struct (p:variable prule) () #:transparent) 55 56 ;; (make-p:module <Base> PrepareEnv ?stx stx ?Deriv ?stx ?exn Deriv ?stx) 57 ;; (make-p:#%module-begin <Base> Stx ModuleBegin/Phase ?exn) 58 (define-struct (p:module prule) (prep tag rename check tag2 ?3 body shift) 59 #:transparent) 60 (define-struct (p:#%module-begin prule) (me body ?2 subs) #:transparent) 61 62 ;; (make-p:define-syntaxes <Base> (listof LocalAction) DerivLL (listof LocalAction)) 63 ;; (make-p:define-values <Base> Deriv) 64 (define-struct (p:define-syntaxes prule) (prep rhs locals) #:transparent) 65 (define-struct (p:define-values prule) (rhs) #:transparent) 66 67 ;; (make-p:#%expression <Base> Deriv ?Stx) 68 ;; (make-p:if <Base> Boolean Deriv Deriv Deriv) 69 ;; (make-p:wcm <Base> Deriv Deriv Deriv) 70 ;; (make-p:set! <Base> Rs ?Exn Deriv) 71 ;; (make-p:set!-macro <Base> Rs Deriv) 72 (define-struct (p:#%expression prule) (inner untag) #:transparent) 73 (define-struct (p:if prule) (test then else) #:transparent) 74 (define-struct (p:wcm prule) (key mark body) #:transparent) 75 (define-struct (p:set! prule) (id-resolves ?2 rhs) #:transparent) 76 (define-struct (p:set!-macro prule) (deriv) #:transparent) 77 78 ;; (make-p:#%app <Base> Stx LDeriv) 79 ;; (make-p:begin <Base> LDeriv) 80 ;; (make-p:begin0 <Base> Deriv LDeriv) 81 (define-struct (p:#%app prule) (lderiv) #:transparent) 82 (define-struct (p:begin prule) (lderiv) #:transparent) 83 (define-struct (p:begin0 prule) (first lderiv) #:transparent) 84 85 ;; (make-p:lambda <Base> LambdaRenames BDeriv) 86 ;; (make-p:case-lambda <Base> (list-of CaseLambdaClause)) 87 ;; (make-p:let-values <Base> LetRenames (list-of Deriv) BDeriv) 88 ;; (make-p:letrec-values <Base> LetRenames (list-of Deriv) BDeriv) 89 ;; (make-p:letrec-syntaxes+values <Base> LSVRenames PrepareExpEnv 90 ;; (list-of BindSyntaxes) (list-of Deriv) BDeriv ?Stx) 91 (define-struct (p:lambda prule) (renames body) #:transparent) 92 (define-struct (p:case-lambda prule) (renames+bodies) #:transparent) 93 (define-struct (p:let-values prule) (renames rhss body) #:transparent) 94 (define-struct (p:letrec-values prule) (renames rhss body) #:transparent) 95 (define-struct (p:letrec-syntaxes+values prule) 96 (srenames prep sbindrhss vrenames vrhss body tag) 97 #:transparent) 98 99 ;; (make-p:provide <Base> (listof Deriv) ?exn) 100 (define-struct (p:provide prule) (inners ?2) #:transparent) 101 102 ;; (make-p:require <Base> (listof LocalAction)) 103 (define-struct (p:require prule) (locals) #:transparent) 104 105 (define-struct (p:submodule prule) (exp) #:transparent) 106 (define-struct (p:submodule* prule) () #:transparent) 107 108 ;; (make-p:#%stratified-body <Base> BDeriv) 109 (define-struct (p:#%stratified-body prule) (bderiv) #:transparent) 110 111 ;; (make-p:begin-for-syntax <base> (listof LocalAction) BFSBody) 112 ;; where BFSBody is one of 113 ;; - ModuleBegin/Phase 114 ;; - (list BeginForSyntaxLifts ... LDeriv)) 115 (define-struct (p:begin-for-syntax prule) (prep body locals) #:transparent) 116 117 ;; (make-p:stop <Base>) 118 ;; (make-p:unknown <Base>) 119 ;; (make-p:#%top <Base> Stx) 120 ;; (make-p:#%datum <Base> Stx) 121 ;; (make-p:quote <Base>) 122 ;; (make-p:quote-syntax <Base>) 123 ;; (make-p:#%variable-reference <Base>) 124 (define-struct (p::STOP prule) () #:transparent) 125 (define-struct (p:stop p::STOP) () #:transparent) 126 (define-struct (p:unknown p::STOP) () #:transparent) 127 (define-struct (p:#%top p::STOP) () #:transparent) 128 (define-struct (p:#%datum p::STOP) () #:transparent) 129 (define-struct (p:quote p::STOP) () #:transparent) 130 (define-struct (p:quote-syntax p::STOP) () #:transparent) 131 (define-struct (p:#%variable-reference p::STOP) () #:transparent) 132 133 ;; A LDeriv is 134 ;; (make-lderiv <Node(Stxs)> ?exn (list-of Deriv)) 135 (define-struct (lderiv node) (?1 derivs) #:transparent) 136 137 ;; A BDeriv is 138 ;; (make-bderiv <Node(Stxs)> (list-of BRule) (U 'list 'letrec) LDeriv/Deriv) 139 ;; pass2 is Deriv if 'letrec, LDeriv if 'list 140 (define-struct (bderiv node) (pass1 trans pass2) #:transparent) 141 142 ;; A BRule is one of 143 ;; (make-b:error exn) 144 ;; (make-b:expr BlockRenames Deriv) 145 ;; (make-b:splice BlockRenames Deriv ?exn Stxs ?exn) 146 ;; (make-b:defvals BlockRenames Deriv ?exn Stx ?exn) 147 ;; (make-b:defstx BlockRenames Deriv ?exn Stx ?exn PrepareExpEnv BindSyntaxes) 148 (define-struct b:error (?1) #:transparent) 149 (define-struct brule (renames) #:transparent) 150 (define-struct (b:expr brule) (head) #:transparent) 151 (define-struct (b:splice brule) (head ?1 tail ?2) #:transparent) 152 (define-struct (b:defvals brule) (head ?1 rename ?2) #:transparent) 153 (define-struct (b:defstx brule) (head ?1 rename ?2 prep bindrhs) #:transparent) 154 155 ;; A BindSyntaxes is 156 ;; (make-bind-syntaxes DerivLL (listof LocalAction)) 157 (define-struct bind-syntaxes (rhs locals) #:transparent) 158 159 ;; A CaseLambdaClause is 160 ;; (make-clc ?exn CaseLambdaRename BDeriv) 161 (define-struct clc (?1 renames body) #:transparent) 162 163 ;; A BlockRename is (cons Stx Stx) 164 165 ;; A BeginForSyntaxLifts is 166 ;; (make-bfs:lift LDeriv (listof stx)) 167 (define-struct bfs:lift (lderiv lifts) #:transparent) 168 169 ;; A ModuleBegin/Phase is (module-begin/phase ModulePass1 ModulePass2 ModulePass3) 170 (define-struct module-begin/phase (pass1 pass2 pass3) #:transparent) 171 172 ;; A ModPass1 is (list-of ModRule1) 173 ;; A ModPass2 is (list-of ModRule2) 174 ;; A ModPass3 is (list-of p:provide) 175 176 ;; A ModRule1 is one of 177 ;; (make-mod:prim Deriv Stx ModPrim) 178 ;; (make-mod:splice Deriv Stx ?exn Stxs) 179 ;; (make-mod:lift Deriv ?Stxs Stxs) 180 ;; (make-mod:lift-end Stxs) 181 ;; A ModRule2 is one of 182 ;; (make-mod:skip) 183 ;; (make-mod:cons Deriv) 184 ;; (make-mod:lift Deriv Stxs) 185 (define-struct modrule () #:transparent) 186 (define-struct (mod:prim modrule) (head rename prim) #:transparent) 187 (define-struct (mod:splice modrule) (head rename ?1 tail) #:transparent) 188 (define-struct (mod:lift modrule) (head locals renames tail) #:transparent) 189 (define-struct (mod:lift-end modrule) (tail) #:transparent) 190 (define-struct (mod:cons modrule) (head locals) #:transparent) 191 (define-struct (mod:skip modrule) () #:transparent) 192 193 ;; A ModPrim is either #f or one of the following PRule variants: 194 ;; - p:define-values 195 ;; - p:define-syntaxes 196 ;; - p:begin-for-syntax 197 ;; - p:require 198 ;; - p:provide 199 200 201 ;; ECTE represents expand/compile-time-evals 202 ;; (make-ecte stx ?stx (listof LocalAction) Deriv Deriv (listof LocalAction)) 203 204 (define-struct (ecte deriv) (locals first second locals2) #:transparent)