tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

2110af3c5e5acf19134eccbed30b6720f1174c72ca4919c175b09b97dbbe9377.tri (10477B)


      1 !import prelude *
      2 !import parser *
      3 !import source_parser *
      4 !import source_ast *
      5 !import source_lexer *
      6 !import source_core *
      7 !import source_equations *
      8 !import source_pattern *
      9 !export *
     10 
     11 -- The innermost lexical binder has index zero. Both lookup workers recurse on
     12 -- their consumed list before touching the remaining state.
     13 sourceFindBinder_ self binders name index =
     14   lazyList
     15     (_ : nothing)
     16     (binder rest :
     17       lazyBool
     18         (_ : just index)
     19         (_ : self rest name (succ index))
     20         (equal? binder name))
     21     binders
     22 
     23 sourceFindBinder = (binders name : y sourceFindBinder_ binders name 0)
     24 
     25 -- CompileEnvironment is a list of (qualifiedName, already-resolved Tree).
     26 sourceFindExternal_ self entries name =
     27   lazyList
     28     (_ : nothing)
     29     (entry rest :
     30       lazyBool
     31         (_ : just (snd entry))
     32         (_ : self rest name)
     33         (equal? (fst entry) name))
     34     entries
     35 
     36 sourceFindExternal = (entries name : y sourceFindExternal_ entries name)
     37 
     38 sourceResolveName node binders environment =
     39   lazyMaybe
     40     (_ : lazyMaybe
     41       (_ : err
     42         (parserDiagnostic 20 (sourceAstPayload node) t
     43           (sourceAstStart node) t)
     44         node)
     45       (tree : ok (sourceCoreExternal tree
     46                     (sourceAstStart node) (sourceAstEnd node)) t)
     47       (sourceFindExternal environment (sourceAstPayload node)))
     48     (index : ok (sourceCoreBound index
     49                   (sourceAstStart node) (sourceAstEnd node)) t)
     50     (sourceFindBinder binders (sourceAstPayload node))
     51 
     52 sourceResolveApply self node binders environment =
     53   lazyResult
     54     (diagnostic rest : err diagnostic rest)
     55     (left unused :
     56       lazyResult
     57         (diagnostic rest : err diagnostic rest)
     58         (right unused :
     59           ok (sourceCoreApply left right
     60                 (sourceAstStart node) (sourceAstEnd node)) t)
     61         (self (snd (sourceAstPayload node)) binders environment))
     62     (self (fst (sourceAstPayload node)) binders environment)
     63 
     64 sourceResolvePipe self node binders environment =
     65   lazyResult
     66     (diagnostic remainder : err diagnostic remainder)
     67     (left unused :
     68       lazyResult
     69         (diagnostic remainder : err diagnostic remainder)
     70         (right unused :
     71           lazyBool
     72             (_ : ok (sourceCoreApply left right
     73                   (sourceAstStart node) (sourceAstEnd node)) t)
     74             (_ : ok (sourceCoreApply right left
     75                   (sourceAstStart node) (sourceAstEnd node)) t)
     76             (equal? (sourceAstPipeDirection node)
     77               sourceTokenPipeBackward))
     78         (self (sourceAstPipeRight node) binders environment))
     79     (self (sourceAstPipeLeft node) binders environment)
     80 
     81 sourceResolveLambda self node binders environment =
     82   lazyResult
     83     (diagnostic rest : err diagnostic rest)
     84     (body unused :
     85       ok (sourceCoreLambda body
     86             (sourceAstStart node) (sourceAstEnd node)) t)
     87     (self (snd (sourceAstPayload node))
     88       (pair (fst (sourceAstPayload node)) binders) environment)
     89 
     90 sourceResolveGroup self node binders environment =
     91   lazyResult
     92     (diagnostic rest : err diagnostic rest)
     93     (body unused :
     94       ok (sourceCoreWithSpan body
     95             (sourceAstStart node) (sourceAstEnd node)) t)
     96     (self (sourceAstPayload node) binders environment)
     97 
     98 -- Resolve the value outside the new binder, and the body inside it. The
     99 -- core representation needs no special let node: (name : body) value.
    100 sourceResolveDo self node binders environment =
    101   lazyResult
    102     (diagnostic remainder : err diagnostic remainder)
    103     (core remainder : ok
    104       (sourceCoreWithSpan core (sourceAstStart node) (sourceAstEnd node)) t)
    105     (self (sourceAstDoLower node) binders environment)
    106 
    107 sourceResolveLocal self node binders environment =
    108   lazyResult
    109     (diagnostic remainder : err diagnostic remainder)
    110     (value unused :
    111       lazyResult
    112         (diagnostic remainder : err diagnostic remainder)
    113         (body unused : ok
    114           (sourceCoreApply
    115             (sourceCoreLambda body (sourceAstStart node) (sourceAstEnd node))
    116             value (sourceAstStart node) (sourceAstEnd node)) t)
    117         (self (sourceAstLetBody node)
    118           (pair (sourceAstLetName node) binders) environment))
    119     (self (sourceAstLetValue node) binders environment)
    120 
    121 -- Resolve children in source order so the first missing name keeps its own
    122 -- location. Accumulate in reverse with constant-time cons, then reverse once.
    123 sourceResolveElements_ self nodes resolve binders environment reversed =
    124   lazyList
    125     (_ : ok (reverse reversed) t)
    126     (element rest :
    127       lazyResult
    128         (diagnostic remainder : err diagnostic remainder)
    129         (core remainder :
    130           self rest resolve binders environment (pair core reversed))
    131         (resolve element binders environment))
    132     nodes
    133 
    134 sourceResolveElements = (nodes resolve binders environment :
    135   y sourceResolveElements_ nodes resolve binders environment t)
    136 
    137 sourceResolveList self node binders environment =
    138   lazyResult
    139     (diagnostic remainder : err diagnostic remainder)
    140     (elements remainder : ok
    141       (sourceCoreList elements (sourceAstStart node) (sourceAstEnd node)) t)
    142     (sourceResolveElements (sourceAstPayload node) self binders environment)
    143 
    144 -- Pins resolve against surrounding binders only; equation captures are
    145 -- introduced together for the body, in the lowerer's reverse lexical order.
    146 sourceResolvePatternNode pattern payload = (sourcePatternNode
    147   (sourceEquationTag pattern) payload (sourceAstStart pattern))
    148 sourceResolvePatternChild self pattern child binders environment = (lazyResult
    149   (diagnostic remainder : err diagnostic remainder)
    150   (core unused : ok (sourceResolvePatternNode pattern core) t)
    151   (self child binders environment))
    152 sourceResolvePattern_ self pattern binders environment = (let tag = sourceEquationTag pattern in
    153   let payload = sourceEquationPayload pattern in
    154   lazyBool (_ : sourceResolvePatternChild self pattern payload binders environment)
    155     (_ : lazyBool
    156       (_ : lazyResult (diagnostic remainder : err diagnostic remainder)
    157         (left unused : lazyResult (diagnostic remainder : err diagnostic remainder)
    158           (right unused : ok (sourceResolvePatternNode pattern (pair left right)) t)
    159           (self (snd payload) binders environment))
    160         (self (fst payload) binders environment))
    161       (_ : lazyBool
    162         (_ : lazyResult (diagnostic remainder : err diagnostic remainder)
    163           (child unused : ok (sourceResolvePatternNode pattern (pair (fst payload) child)) t)
    164           (self (snd payload) binders environment))
    165         (_ : lazyBool
    166           (_ : sourceResolvePatternChild sourceResolveName pattern payload binders environment)
    167           (_ : ok (sourceResolvePatternNode pattern payload) t) (equal? tag 7))
    168         (equal? tag 6)) (equal? tag 3)) (equal? tag 2))
    169 sourceResolvePattern pattern binders environment = y sourceResolvePattern_ pattern binders environment
    170 sourceResolveEquation resolve equation binders environment = (lazyResult
    171   (diagnostic remainder : err diagnostic remainder)
    172   (patterns unused : lazyResult (diagnostic remainder : err diagnostic remainder)
    173     (body unused : ok (sourceEquation patterns body) t)
    174     (resolve (snd equation)
    175       (append (reverse (sourceEquationCollect (fst equation) sourceEquationCaptures)) binders)
    176       environment))
    177   (sourceResolveElements (fst equation) sourceResolvePattern binders environment))
    178 sourceResolveEquations resolve node binders environment = (lazyResult
    179   (diagnostic remainder : err diagnostic remainder)
    180   (_ unused : lazyResult (diagnostic remainder : err diagnostic remainder)
    181     (equations unused : lazyResult (diagnostic remainder : err diagnostic remainder)
    182       (core unused : ok (sourceCoreWithSpan core (sourceAstStart node) (sourceAstEnd node)) t)
    183       (sourceLowerEquations equations))
    184     (sourceResolveElements (sourceAstPayload node) (sourceResolveEquation resolve) binders environment))
    185   (sourceEquationCheckGroup node))
    186 
    187 sourceResolve_ self node binders environment =
    188   lazyBool
    189     (_ : ok (sourceCoreLeaf
    190           (sourceAstStart node) (sourceAstEnd node)) t)
    191     (_ : lazyBool
    192       (_ : sourceResolveName node binders environment)
    193       (_ : lazyBool
    194         (_ : sourceResolveApply self node binders environment)
    195         (_ : lazyBool
    196           (_ : sourceResolveLambda self node binders environment)
    197           (_ : lazyBool
    198             (_ : sourceResolveGroup self node binders environment)
    199             (_ : lazyBool
    200               (_ : ok (sourceCoreNumber (sourceAstPayload node)
    201                     (sourceAstStart node) (sourceAstEnd node)) t)
    202               (_ : lazyBool
    203                 (_ : ok (sourceCoreString (sourceAstPayload node)
    204                       (sourceAstStart node) (sourceAstEnd node)) t)
    205                 (_ : lazyBool
    206                   (_ : sourceResolveList self node binders environment)
    207                   (_ : lazyBool
    208                     (_ : sourceResolveLocal self node binders environment)
    209                     (_ : lazyBool
    210                       (_ : sourceResolvePipe self node binders environment)
    211                       (_ : lazyBool
    212                         (_ : sourceResolveDo self node binders environment)
    213                         (_ : lazyBool
    214                           (_ : sourceResolveEquations self node binders environment)
    215                           (_ : err (parserDiagnostic 21 t (sourceAstKind node)
    216                             (sourceAstStart node) t) node)
    217                           (equal? (sourceAstKind node) sourceAstEquationsKind))
    218                         (equal? (sourceAstKind node) sourceAstDoKind))
    219                       (equal? (sourceAstKind node) sourceAstPipeKind))
    220                     (equal? (sourceAstKind node) sourceAstLetKind))
    221                   (equal? (sourceAstKind node) sourceAstListKind))
    222                 (equal? (sourceAstKind node) sourceAstStringKind))
    223               (equal? (sourceAstKind node) sourceAstNumberKind))
    224             (equal? (sourceAstKind node) sourceAstGroupKind))
    225           (equal? (sourceAstKind node) sourceAstLambdaKind))
    226         (equal? (sourceAstKind node) sourceAstApplyKind))
    227       (equal? (sourceAstKind node) sourceAstNameKind))
    228     (equal? (sourceAstKind node) sourceAstLeafKind)
    229 
    230 resolveGateAst = (environment node :
    231   y sourceResolve_ node t environment)
    232 
    233 resolveGateSource = (environment characters :
    234   parserMatchReply
    235     (diagnostic rest consumed committed : err diagnostic rest)
    236     (ast rest consumed committed : resolveGateAst environment ast)
    237     (parseGateSource characters))
    238