summaryrefslogtreecommitdiff
path: root/paper/While/WhileCommon.icl
diff options
context:
space:
mode:
Diffstat (limited to 'paper/While/WhileCommon.icl')
-rw-r--r--paper/While/WhileCommon.icl18
1 files changed, 10 insertions, 8 deletions
diff --git a/paper/While/WhileCommon.icl b/paper/While/WhileCommon.icl
index 353f997..a76458f 100644
--- a/paper/While/WhileCommon.icl
+++ b/paper/While/WhileCommon.icl
@@ -40,21 +40,22 @@ instance eval AExpr Int
where
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 >>= \r2 -> toOp op r1 r2
+ eval (Op a1 op a2) st = eval a1 st >>= \r1 -> eval a2 st >>= toOp 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))
+ toOp 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 (And b1 b2) st = eval b1 st >>= \r -> eval b2 st >>= pure o ((&&) r)
- eval (Or b1 b2) st = eval b1 st >>= \r -> eval b2 st >>= pure o ((||) r)
- eval (Comp a1 cmp a2) st = eval a1 st >>= \r -> eval a2 st >>= pure o (toCmp cmp r)
+ 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
@@ -81,9 +82,10 @@ paref = Var o toVar <$> satisfy isVarToken
<|> (\(LiteralToken i) -> Lit i) <$> satisfy isLiteralToken
<|> item ParenOpen *> paexpr <* item ParenClose
-toComp EqToken = Eq; toComp NeToken = Ne; toComp LeToken = Le
-toComp LtToken = Lt; toComp GeToken = Ge; toComp GtToken = Lt
-isCompToken t = isMember t [EqToken, NeToken, LeToken, LtToken, GeToken, GtToken]
+toComp EqToken = Eq; toComp NeToken = Ne
+toComp LeToken = Le; toComp LtToken = Lt
+toComp GeToken = Ge; toComp GtToken = Gt
+isCompToken t = isMember t [EqToken,NeToken,LeToken,LtToken,GeToken,GtToken]
toBool (BoolToken b) = Bool b
isBoolToken (BoolToken _) = True; isBoolToken _ = False
toVar (VarToken v) = v