diff options
Diffstat (limited to '')
| -rw-r--r-- | new-luxc/source/luxc/analyser.lux | 21 | ||||
| -rw-r--r-- | new-luxc/source/luxc/analyser/structure.lux | 24 | 
2 files changed, 27 insertions, 18 deletions
| diff --git a/new-luxc/source/luxc/analyser.lux b/new-luxc/source/luxc/analyser.lux index 97312b805..b10f29369 100644 --- a/new-luxc/source/luxc/analyser.lux +++ b/new-luxc/source/luxc/analyser.lux @@ -67,28 +67,28 @@               (#;Symbol reference)               (&&reference;analyse-reference reference) -             (^ (#;Form (list [_ (#;Symbol ["" "_lux_function"])] +             (^ (#;Form (list [_ (#;Text "lux function")]                                [_ (#;Symbol ["" func-name])]                                [_ (#;Symbol ["" arg-name])]                                body)))               (&&function;analyse-function analyse func-name arg-name body) -             (^template [<proc> <analyser>] -               (^ (#;Form (list [_ (#;Symbol ["" <proc>])] type value))) +             (^template [<special> <analyser>] +               (^ (#;Form (list [_ (#;Text <special>)] type value)))                 (<analyser> analyse eval type value)) -             (["_lux_check" &&type;analyse-check] -              ["_lux_coerce" &&type;analyse-coerce]) +             (["lux check" &&type;analyse-check] +              ["lux coerce" &&type;analyse-coerce]) -             (^ (#;Form (list& [_ (#;Text proc-name)] proc-args))) -             (&&procedure;analyse-procedure analyse proc-name proc-args) - -             (^ (#;Form (list& [_ (#;Symbol ["" "_lux_case"])] +             (^ (#;Form (list& [_ (#;Text "lux case")]                                 input                                 branches)))               (do meta;Monad<Meta>                 [paired (to-branches branches)]                 (&&case;analyse-case analyse input paired)) +             (^ (#;Form (list& [_ (#;Text proc-name)] proc-args))) +             (&&procedure;analyse-procedure analyse proc-name proc-args) +               (^template [<tag> <analyser>]                 (^ (#;Form (list& [_ (<tag> tag)]                                   values))) @@ -101,6 +101,9 @@               ([#;Nat &&structure;analyse-sum]                [#;Tag &&structure;analyse-tagged-sum]) +             (#;Tag tag) +             (&&structure;analyse-tagged-sum analyse tag (' [])) +                            (^ (#;Form (list& func args)))               (do meta;Monad<Meta>                 [[funcT =func] (&&common;with-unknown-type diff --git a/new-luxc/source/luxc/analyser/structure.lux b/new-luxc/source/luxc/analyser/structure.lux index 3bcc04d7e..8c1f7118c 100644 --- a/new-luxc/source/luxc/analyser/structure.lux +++ b/new-luxc/source/luxc/analyser/structure.lux @@ -206,19 +206,25 @@          (&;fail "")          )))) -(def: #export (analyse-tagged-sum analyse tag value) +(def: #export (analyse-tagged-sum analyse tag valueC)    (-> &;Analyser Ident Code (Meta la;Analysis))    (do meta;Monad<Meta>      [tag (meta;normalize tag)       [idx group variantT] (meta;resolve-tag tag) -     #let [case-size (list;size group)] -     inferenceT (&inference;variant-inference-type idx case-size variantT) -     [inferredT valueA+] (&inference;apply-function analyse inferenceT (list value)) -     expectedT meta;expected-type -     _ (&;with-type-env -         (tc;check expectedT inferredT)) -     temp &scope;next-local] -    (wrap (la;sum idx case-size temp (|> valueA+ list;head maybe;assume))))) +     expectedT meta;expected-type] +    (case expectedT +      (#;Var _) +      (do @ +        [#let [case-size (list;size group)] +         inferenceT (&inference;variant-inference-type idx case-size variantT) +         [inferredT valueA+] (&inference;apply-function analyse inferenceT (list valueC)) +         _ (&;with-type-env +             (tc;check expectedT inferredT)) +         temp &scope;next-local] +        (wrap (la;sum idx case-size temp (|> valueA+ list;head maybe;assume)))) + +      _ +      (analyse-sum analyse idx valueC))))  ## There cannot be any ambiguity or improper syntax when analysing  ## records, so they must be normalized for further analysis. | 
