71a3abc22d94d1ff0008c473eab0a699494cca03
[clean-tests.git] / expr / shallow.icl
1 module shallow
2
3 import StdEnv
4 import Data.Func
5 import Data.Functor
6 import Data.Either
7 import Data.List
8 import Data.Maybe
9 import Control.Applicative
10 import Control.Monad
11
12 :: Expr :==
13 ([(String, Int)] -> Either String Int //Evaluator
14 , String) //Printer
15
16 lit :: Int -> Expr
17 lit i = (const $ pure i, toString i)
18
19 var :: String -> Expr
20 var s =
21 ( maybe (Left $ "Undefined variable " +++ s) Right o lookup s
22 , s
23 )
24
25 (+.) infixl 6 :: Expr Expr -> Expr
26 (+.) (ea, pa) (eb, pb) =
27 ( \s->liftM2 (+) (ea s) (eb s)
28 , pa +++ " + " +++ pb
29 )
30
31 print :: Expr -> String
32 print (_, p) = p
33
34 eval :: Expr [(String, Int)]-> Either String Int
35 eval (e, _) s = e s
36
37 Start = eval (lit 5 +. lit 37) []