-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) []