From 5a3007ea91a3ee57a4fc3e34c0edd59a90b525c3 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 27 Nov 2023 19:00:20 +0100 Subject: WIP on code generation for case expressions --- snug-clean/src/Snug/Syntax.icl | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'snug-clean/src/Snug/Syntax.icl') diff --git a/snug-clean/src/Snug/Syntax.icl b/snug-clean/src/Snug/Syntax.icl index f886750..839e067 100644 --- a/snug-clean/src/Snug/Syntax.icl +++ b/snug-clean/src/Snug/Syntax.icl @@ -1 +1,35 @@ implementation module Snug.Syntax + +import qualified Data.Set +from Data.Set import :: Set +import StdEnv + +none = 'Data.Set'.newSet + +instance usedSymbols [a] | usedSymbols a +where + usedSymbols xs = 'Data.Set'.unions (map usedSymbols xs) + +instance usedSymbols (a, b) | usedSymbols a & usedSymbols b +where + usedSymbols (x,y) = 'Data.Set'.union (usedSymbols x) (usedSymbols y) + +instance usedSymbols CaseAlternative +where + usedSymbols (CaseAlternative pat expr) = + 'Data.Set'.difference (usedSymbols expr) (usedSymbols pat) + +instance usedSymbols Expression +where + usedSymbols (BasicValue _) = none + usedSymbols (Symbol sym) = none + usedSymbols (Constructor _) = none + usedSymbols (Case e alts) = usedSymbols (e, alts) + usedSymbols (ExpApp e1 e2) = usedSymbols (e1, e2) + +instance usedSymbols Pattern +where + usedSymbols Wildcard = none + usedSymbols (BasicValuePattern _) = none + usedSymbols (IdentPattern id) = 'Data.Set'.singleton id + usedSymbols (ConstructorPattern _ syms) = 'Data.Set'.fromList syms -- cgit v1.2.3