diff options
author | Camil Staps | 2016-06-03 00:39:37 +0200 |
---|---|---|
committer | Camil Staps | 2016-06-03 00:39:37 +0200 |
commit | 6ecadcb8571712536f9d121264f67f30f7bb0147 (patch) | |
tree | 0542e10ca752f538195095713ca786ab494335b6 /paper/While/WhileCommon.icl | |
parent | Update example program (diff) |
First version almost finished
Diffstat (limited to 'paper/While/WhileCommon.icl')
-rw-r--r-- | paper/While/WhileCommon.icl | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/paper/While/WhileCommon.icl b/paper/While/WhileCommon.icl index a76458f..ce4f8fe 100644 --- a/paper/While/WhileCommon.icl +++ b/paper/While/WhileCommon.icl @@ -9,7 +9,8 @@ import Yard derive gEq AExpr, Operator, BExpr, Comparator -instance zero State where zero = \v -> Left (Runtime "Undefined variable") +instance zero State +where zero = \v -> Left (Runtime "Undefined") instance toString AExpr where @@ -38,32 +39,36 @@ where instance eval AExpr Int where + eval :: AExpr State -> Either Error Int eval (Var v) st = st v - eval (Lit i) st = pure i - eval (Op a1 op a2) st = eval a1 st >>= \r1 -> eval a2 st >>= toOp op r1 + eval (Lit i) _ = pure i + eval (Op a1 op a2) st + = eval a1 st >>= \r1 -> + eval a2 st >>= app op r1 where - toOp :: Operator -> Int Int -> Either Error Int - toOp Add = \i j -> pure (i + j) - toOp Sub = \i j -> pure (i - j) - toOp Mul = \i j -> pure (i * j) - toOp Div = \i j -> - if (j == 0) (Left (Runtime "Division by 0")) (pure (i / j)) + app :: Operator -> Int Int -> Either Error Int + app Add = pure on (+) + app Sub = pure on (-) + app Mul = pure on (*) + app Div = \i j -> if (j == 0) + (Left (Runtime "Division by 0")) + (pure (i / j)) instance eval BExpr Bool where eval (Bool b) st = pure b - eval (Not b) st = eval b st >>= pure o not + eval (Not b) st = not <$> eval b st eval (And b1 b2) st = liftM2 (&&) (eval b1 st) (eval b2 st) eval (Or b1 b2) st = liftM2 (||) (eval b1 st) (eval b2 st) eval (Comp a1 cmp a2) st = liftM2 (toCmp cmp) (eval a1 st) (eval a2 st) where toCmp :: Comparator -> Int Int -> Bool - toCmp Eq = \i j -> i == j - toCmp Ne = \i j -> i <> j - toCmp Le = \i j -> i <= j - toCmp Lt = \i j -> i < j - toCmp Ge = \i j -> i >= j - toCmp Gt = \i j -> i > j + toCmp Eq = (==) + toCmp Ne = (<>) + toCmp Le = (<=) + toCmp Lt = (<) + toCmp Ge = (>=) + toCmp Gt = (>) pbexpr :: Parser Token BExpr pbexpr = liftM2 Or pbconj (item OrToken *> pbexpr) <|> pbconj |