www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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)