aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/Snug/Syntax.icl
diff options
context:
space:
mode:
authorCamil Staps2023-11-27 19:00:20 +0100
committerCamil Staps2023-11-27 19:00:20 +0100
commit5a3007ea91a3ee57a4fc3e34c0edd59a90b525c3 (patch)
tree3addc1233eb1e80657fa36b6599e3ebe3d097d88 /snug-clean/src/Snug/Syntax.icl
parentUpdate to base 2.0 (diff)
WIP on code generation for case expressions
Diffstat (limited to 'snug-clean/src/Snug/Syntax.icl')
-rw-r--r--snug-clean/src/Snug/Syntax.icl34
1 files changed, 34 insertions, 0 deletions
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