aboutsummaryrefslogtreecommitdiff
path: root/sucl/absmodule.icl
diff options
context:
space:
mode:
Diffstat (limited to 'sucl/absmodule.icl')
-rw-r--r--sucl/absmodule.icl73
1 files changed, 73 insertions, 0 deletions
diff --git a/sucl/absmodule.icl b/sucl/absmodule.icl
new file mode 100644
index 0000000..92addeb
--- /dev/null
+++ b/sucl/absmodule.icl
@@ -0,0 +1,73 @@
+implementation module absmodule
+
+import rule
+
+/*
+
+------------------------------------------------------------------------
+Exports.
+
+> %export
+> module
+> addtalias
+> addtsymdef
+> addalias
+> addsymdef
+> newmodule
+
+------------------------------------------------------------------------
+Includes.
+
+> %include "basic.lit"
+> %include "graph.lit" -extgraph
+> %include "rule.lit"
+
+------------------------------------------------------------------------
+Module implementation.
+
+> module * *** **** *****
+> == ( ( [****], || Exported types
+> [(****,rule **** *****)], || Type alias rules
+> [(****,[*])] || Constructor symbols for algebraic type symbol
+> ),
+> ( [*], || Exported symbols
+> [(*,rule * ***)], || Alias rules
+> [(*,(rule **** *****,[bool]))], || Typerule for symbol
+> [(*,[rule * ***])] || Rewrite rules for symbol, absent if imported
+> )
+> )
+
+*/
+
+:: Module sym pvar tsym tvar
+ = { exportedtypesymbols :: [tsym] // Exported type symbols (from DCL)
+ , typealias :: [(tsym,Rule tsym tvar)] // Alias types
+ , typeconstructors :: [(tsym,[sym])] // All constructor symbols of each declared algebraic type
+ , exportedsymbols :: [sym] // Exported function/constructor symbols
+ , aliases :: [(sym,Rule sym pvar)] // Macros
+ , typerules :: [(sym,Rule tsym tvar,[Bool])] // Info from type rules (actual type and argument strictnesses)
+ , rules :: [(sym,[Rule sym pvar])] // Rewrite rules of each symbol, absent if imported
+ }
+
+/*
+
+> newmodule :: module * *** **** *****
+> newmodule = (([],[],[]),([],[],[],[]))
+
+> addtalias :: **** -> bool -> rule **** ***** -> module * *** **** ***** -> module * *** **** *****
+> addtalias ts exp tr ((tes,tas,tcs),defs)
+> = ((cond exp (ts:tes) tes,(ts,tr):tas,tcs),defs)
+
+> addtsymdef :: **** -> bool -> [*] -> module * *** **** ***** -> module * *** **** *****
+> addtsymdef ts exp ss ((tes,tas,tcs),defs)
+> = ((cond exp (ts:tes) tes,tas,(ts,ss):tcs),defs)
+
+> addalias :: * -> bool -> rule * *** -> module * *** **** ***** -> module * *** **** *****
+> addalias s exp r (tdefs,(es,as,ts,rs))
+> = (tdefs,(cond exp (s:es) es,(s,r):as,ts,rs))
+
+> addsymdef :: * -> bool -> rule **** ***** -> bool -> [rule * ***] -> module * *** **** ***** -> module * *** **** *****
+> addsymdef s exp t imp rr (tdefs,(es,as,ts,rs))
+> = (tdefs,(cond exp (s:es) es,as,(s,(t,[])):ts,cond imp rs ((s,rr):rs)))
+
+*/