summaryrefslogtreecommitdiff
path: root/old-lib/prelude/Formal.gf
diff options
context:
space:
mode:
authoraarne <aarne@chalmers.se>2009-06-22 15:39:08 +0000
committeraarne <aarne@chalmers.se>2009-06-22 15:39:08 +0000
commite89fdae2fa1626348d8025824a7469252fa85e42 (patch)
treec7d46bbd0494043b4bd6f917a25a7687517d0547 /old-lib/prelude/Formal.gf
parent3049b59b35b25381a7c6787444165c200d66e08b (diff)
next-lib renamed to lib, lib to old-lib
Diffstat (limited to 'old-lib/prelude/Formal.gf')
-rw-r--r--old-lib/prelude/Formal.gf54
1 files changed, 54 insertions, 0 deletions
diff --git a/old-lib/prelude/Formal.gf b/old-lib/prelude/Formal.gf
new file mode 100644
index 000000000..2aa33d9ef
--- /dev/null
+++ b/old-lib/prelude/Formal.gf
@@ -0,0 +1,54 @@
+resource Formal = open Prelude in {
+
+-- to replace the old library Precedence
+
+ oper
+ Prec : PType ;
+ TermPrec : Type = {s : Str ; p : Prec} ;
+
+ mkPrec : Prec -> Str -> TermPrec = \p,s ->
+ {s = s ; p = p} ;
+
+ top : TermPrec -> Str = usePrec 0 ;
+
+ constant : Str -> TermPrec = mkPrec highest ;
+
+ infixl : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y ->
+ mkPrec p (usePrec p x ++ f ++ usePrec (nextPrec p) y) ;
+ infixr : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y ->
+ mkPrec p (usePrec (nextPrec p) x ++ f ++ usePrec p y) ;
+ infixn : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y ->
+ mkPrec p (usePrec (nextPrec p) x ++ f ++ usePrec (nextPrec p) y) ;
+
+-- auxiliaries, should not be needed so much
+
+ usePrec : Prec -> TermPrec -> Str = \p,x ->
+ case lessPrec x.p p of {
+ True => parenth x.s ;
+ False => parenthOpt x.s
+ } ;
+
+ parenth : Str -> Str = \s -> "(" ++ s ++ ")" ;
+ parenthOpt : Str -> Str = \s -> variants {s ; "(" ++ s ++ ")"} ;
+
+--.
+-- low-level things: don't use
+
+ Prec : PType = Predef.Ints 4 ;
+
+ highest = 4 ;
+
+ lessPrec : Prec -> Prec -> Bool = \p,q ->
+ case <<p,q> : Prec * Prec> of {
+ <3,4> | <2,3> | <2,4> => True ;
+ <1,1> | <1,0> | <0,0> => False ;
+ <1,_> | <0,_> => True ;
+ _ => False
+ } ;
+
+ nextPrec : Prec -> Prec = \p -> case <p : Prec> of {
+ 4 => 4 ;
+ n => Predef.plus n 1
+ } ;
+
+}