diff options
Diffstat (limited to 'stdlib/source/library/lux/tool/compiler')
4 files changed, 34 insertions, 21 deletions
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis.lux index 53968905c..5bebbcde9 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis.lux @@ -7,7 +7,12 @@ ["[0]" exception {"+" [exception:]}]] [data [text - ["%" format {"+" [format]}]]] + ["%" format {"+" [format]}]] + [collection + ["[0]" list]]] + [math + [number + ["n" nat]]] ["[0]" meta ["[0]" location]]]] ["[0]" / "_" @@ -29,7 +34,8 @@ [archive {"+" [Archive]}]]]]]]) (exception: .public (unrecognized_syntax [code Code]) - (exception.report ["Code" (%.code code)])) + (exception.report + ["Code" (%.code code)])) ... TODO: Had to split the 'compile' function due to compilation issues ... with old-luxc. Must re-combine all the code ASAP @@ -50,8 +56,8 @@ [#.Frac /primitive.frac] [#.Text /primitive.text]) - (^ {#.Form (list& [_ {#.Tag tag}] - values)}) + (^ {#.Variant (list& [_ {#.Tag tag}] + values)}) (case values {#.Item value #.End} (/structure.tagged_sum compile tag archive value) @@ -59,8 +65,8 @@ _ (/structure.tagged_sum compile tag archive (` [(~+ values)]))) - (^ {#.Form (list& [_ {#.Nat lefts}] [_ {#.Bit right?}] - values)}) + (^ {#.Variant (list& [_ {#.Nat lefts}] [_ {#.Bit right?}] + values)}) (case values {#.Item value #.End} (/structure.sum compile lefts right? archive value) @@ -83,8 +89,10 @@ {#.Identifier reference} (/reference.reference reference) - (^ {#.Form (list [_ {#.Record branches}] input)}) - (/case.case compile branches archive input) + (^ {#.Form (list [_ {#.Variant branches}] input)}) + (if (n.even? (list.size branches)) + (/case.case compile (list.pairs branches) archive input) + (//.except ..unrecognized_syntax [location.dummy code'])) (^ {#.Form (list& [_ {#.Text extension_name}] extension_args)}) (//extension.apply archive compile [extension_name extension_args]) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux index d7a7bf6ab..69307c2ac 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux @@ -13,7 +13,7 @@ [text ["%" format {"+" [format]}]] [collection - ["[0]" list ("[1]\[0]" mix monoid functor)]]] + ["[0]" list ("[1]\[0]" mix monoid monad)]]] [math [number ["n" nat]]] @@ -57,7 +57,10 @@ coverage Coverage]) (exception.report ["Input" (%.code input)] - ["Branches" (%.code (code.record branches))] + ["Branches" (%.code (code.tuple (|> branches + (list\each (function (_ [slot value]) + (list slot value))) + list\conjoint)))] ["Coverage" (/coverage.%coverage coverage)])) (exception: .public (cannot_have_empty_branches [message Text]) @@ -263,9 +266,9 @@ [location {#.Tag tag}] (/.with_location location - (analyse_pattern #.None inputT (` ((~ pattern))) next)) + (analyse_pattern #.None inputT (` {(~ pattern)}) next)) - (^ [location {#.Form (list& [_ {#.Nat lefts}] [_ {#.Bit right?}] values)}]) + (^ [location {#.Variant (list& [_ {#.Nat lefts}] [_ {#.Bit right?}] values)}]) (/.with_location location (do ///.monad [inputT' (simplify_case inputT)] @@ -304,7 +307,7 @@ _ (/.except ..cannot_match_with_pattern [inputT' pattern])))) - (^ [location {#.Form (list& [_ {#.Tag tag}] values)}]) + (^ [location {#.Variant (list& [_ {#.Tag tag}] values)}]) (/.with_location location (do ///.monad [tag (///extension.lifted (meta.normal tag)) @@ -312,7 +315,7 @@ _ (//type.with_env (check.check inputT variantT)) .let [[lefts right?] (/.choice (list.size group) idx)]] - (analyse_pattern {#.Some (list.size group)} inputT (` ((~ (code.nat lefts)) (~ (code.bit right?)) (~+ values))) next))) + (analyse_pattern {#.Some (list.size group)} inputT (` {(~ (code.nat lefts)) (~ (code.bit right?)) (~+ values)}) next))) _ (/.except ..not_a_pattern pattern) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/structure.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/structure.lux index 417fe9709..0ccb8f1e0 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/structure.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/structure.lux @@ -15,7 +15,7 @@ [text ["%" format {"+" [format]}]] [collection - ["[0]" list ("[1]\[0]" functor)] + ["[0]" list ("[1]\[0]" monad)] ["[0]" dictionary {"+" [Dictionary]}]]] [macro ["[0]" code]] @@ -77,9 +77,10 @@ record (List [Name Code])]) (exception.report ["Tag" (%.code (code.tag key))] - ["Record" (%.code (code.record (list\each (function (_ [keyI valC]) - [(code.tag keyI) valC]) - record)))]))] + ["Record" (%.code (code.tuple (|> record + (list\each (function (_ [keyI valC]) + (list (code.tag keyI) valC))) + list\conjoint)))]))] [cannot_repeat_tag] ) @@ -100,8 +101,9 @@ ["Type" (%.type type)] ["Expression" (%.code (|> record (list\each (function (_ [keyI valueC]) - [(code.tag keyI) valueC])) - code.record))])) + (list (code.tag keyI) valueC))) + list\conjoint + code.tuple))])) (def: .public (sum analyse lefts right? archive) (-> Phase Nat Bit Phase) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux index 4ea0c4e7a..95775c22a 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux @@ -248,7 +248,7 @@ (-> Expander /////analysis.Bundle Handler) (..custom [($_ <>.and <code>.local_identifier <code>.any - (<>.or (<code>.form (<>.some <code>.text)) + (<>.or (<code>.variant (<>.some <code>.text)) (<code>.tuple (<>.some <code>.text))) <code>.any) (function (_ extension_name phase archive [short_name valueC labels exported?C]) |