summaryrefslogtreecommitdiff
path: root/paper/While/WhileCommon.icl
diff options
context:
space:
mode:
authorCamil Staps2016-06-03 00:39:37 +0200
committerCamil Staps2016-06-03 00:39:37 +0200
commit6ecadcb8571712536f9d121264f67f30f7bb0147 (patch)
tree0542e10ca752f538195095713ca786ab494335b6 /paper/While/WhileCommon.icl
parentUpdate example program (diff)
First version almost finished
Diffstat (limited to 'paper/While/WhileCommon.icl')
-rw-r--r--paper/While/WhileCommon.icl37
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