summaryrefslogtreecommitdiff
path: root/src/GF/Grammar/AppPredefined.hs
diff options
context:
space:
mode:
authoraarne <unknown>2003-09-22 13:16:55 +0000
committeraarne <unknown>2003-09-22 13:16:55 +0000
commitb1402e8bd6a68a891b00a214d6cf184d66defe19 (patch)
tree90372ac4e53dce91cf949dbf8e93be06f1d9e8bd /src/GF/Grammar/AppPredefined.hs
Founding the newly structured GF2.0 cvs archive.
Diffstat (limited to 'src/GF/Grammar/AppPredefined.hs')
-rw-r--r--src/GF/Grammar/AppPredefined.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/GF/Grammar/AppPredefined.hs b/src/GF/Grammar/AppPredefined.hs
new file mode 100644
index 000000000..f59c910b0
--- /dev/null
+++ b/src/GF/Grammar/AppPredefined.hs
@@ -0,0 +1,51 @@
+module AppPredefined where
+
+import Operations
+import Grammar
+import Ident
+import PrGrammar (prt)
+---- import PGrammar (pTrm)
+
+-- predefined function definitions. AR 12/3/2003.
+-- Type checker looks at signatures in predefined.gf
+
+appPredefined :: Term -> Term
+appPredefined t = case t of
+
+ App f x -> case f of
+
+ -- one-place functions
+ Q (IC "Predef") (IC f) -> case (f, appPredefined x) of
+ ("length", K s) -> EInt $ length s
+ _ -> t
+
+ -- two-place functions
+ App (Q (IC "Predef") (IC f)) z -> case (f, appPredefined z, appPredefined x) of
+ ("drop", EInt i, K s) -> K (drop i s)
+ ("take", EInt i, K s) -> K (take i s)
+ ("tk", EInt i, K s) -> K (take (max 0 (length s - i)) s)
+ ("dp", EInt i, K s) -> K (drop (max 0 (length s - i)) s)
+ ("eqStr",K s, K t) -> if s == t then predefTrue else predefFalse
+ ("eqInt",EInt i, EInt j) -> if i==j then predefTrue else predefFalse
+ ("plus", EInt i, EInt j) -> EInt $ i+j
+ ("show", _, t) -> K $ prt t
+ ("read", _, K s) -> str2tag s --- because of K, only works for atomic tags
+ _ -> t
+ _ -> t
+ _ -> t
+
+-- read makes variables into constants
+
+str2tag :: String -> Term
+str2tag s = case s of
+---- '\'' : cs -> mkCn $ pTrm $ init cs
+ _ -> Cn $ IC s ---
+ where
+ mkCn t = case t of
+ Vr i -> Cn i
+ App c a -> App (mkCn c) (mkCn a)
+ _ -> t
+
+
+predefTrue = Q (IC "Predef") (IC "PTrue")
+predefFalse = Q (IC "Predef") (IC "PFalse")