From b81f241bd90092f52a47f64f4dc8297cc4f82f56 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Fri, 19 May 2017 23:54:16 -0400 Subject: - WIP: Added pattern-matching (case) analysis. --- new-luxc/source/luxc/analyser.lux | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'new-luxc/source/luxc/analyser.lux') diff --git a/new-luxc/source/luxc/analyser.lux b/new-luxc/source/luxc/analyser.lux index eba8ae62a..d8f5abe9b 100644 --- a/new-luxc/source/luxc/analyser.lux +++ b/new-luxc/source/luxc/analyser.lux @@ -19,9 +19,23 @@ ["&&;" reference] ["&&;" type] ["&&;" struct] - ## ["&&;" case] + ["&&;" case] ["&&;" proc])) +(def: (to-branches raw) + (-> (List Code) (Lux (List [Code Code]))) + (case raw + (^ (list)) + (:: Monad wrap (list)) + + (^ (list& patternH bodyH inputT)) + (do Monad + [outputT (to-branches inputT)] + (wrap (list& [patternH bodyH] outputT))) + + _ + (&;fail "Uneven expressions for pattern-matching."))) + (def: #export (analyser eval) (-> &;Eval &;Analyser) (: (-> Code (Lux la;Analysis)) @@ -67,10 +81,12 @@ [_ (#;Tuple args)]))) (&&proc;analyse-proc analyse proc args) - ## (^ (#;Form (list& [_ (#;Symbol ["" "_lux_case"])] - ## input - ## branches))) - ## (&&case;analyse-case analyse proc branches) + (^ (#;Form (list& [_ (#;Symbol ["" "_lux_case"])] + input + branches))) + (do Monad + [paired (to-branches branches)] + (&&case;analyse-case analyse input paired)) (^ (#;Form (list [_ (#;Nat tag)] value))) -- cgit v1.2.3