bork
[clean-tests.git] / expr / shallow.icl
diff --git a/expr/shallow.icl b/expr/shallow.icl
new file mode 100644 (file)
index 0000000..71a3abc
--- /dev/null
@@ -0,0 +1,37 @@
+module shallow
+
+import StdEnv
+import Data.Func
+import Data.Functor
+import Data.Either
+import Data.List
+import Data.Maybe
+import Control.Applicative
+import Control.Monad
+
+:: Expr :==
+       ([(String, Int)] -> Either String Int //Evaluator
+       , String)                             //Printer
+
+lit :: Int -> Expr
+lit i = (const $ pure i, toString i)
+
+var :: String -> Expr
+var s =
+       ( maybe (Left $ "Undefined variable " +++ s) Right o lookup s
+       , s
+       )
+
+(+.) infixl 6 :: Expr Expr -> Expr
+(+.) (ea, pa) (eb, pb) =
+       ( \s->liftM2 (+) (ea s) (eb s)
+       , pa +++ " + " +++ pb
+       )
+
+print :: Expr -> String
+print (_, p) = p
+
+eval :: Expr [(String, Int)]-> Either String Int
+eval (e, _) s = e s
+
+Start = eval (lit 5 +. lit 37) []