X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=expr%2Fshallow.icl;fp=expr%2Fshallow.icl;h=71a3abc22d94d1ff0008c473eab0a699494cca03;hb=938d3406c1e406db293024b9a5710579a0090893;hp=0000000000000000000000000000000000000000;hpb=53817603554125625f3c7d6b4b9ea0dc4a4bdf78;p=clean-tests.git diff --git a/expr/shallow.icl b/expr/shallow.icl new file mode 100644 index 0000000..71a3abc --- /dev/null +++ b/expr/shallow.icl @@ -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) []