module CalcEval where
import CalcTypes
import CalcStore
eval :: Expr -> Store -> Integer
eval :: Expr -> Store -> Integer
eval (Lit Integer
n) Store
st = Integer
n
eval (Var Var
v) Store
st = Store -> Var -> Integer
value Store
st Var
v
eval (Op Ops
op Expr
e1 Expr
e2) Store
st
= Ops -> Integer -> Integer -> Integer
opValue Ops
op Integer
v1 Integer
v2
where
v1 :: Integer
v1 = Expr -> Store -> Integer
eval Expr
e1 Store
st
v2 :: Integer
v2 = Expr -> Store -> Integer
eval Expr
e2 Store
st
opValue :: Ops -> Integer -> Integer -> Integer
opValue :: Ops -> Integer -> Integer -> Integer
opValue Ops
Add = Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
(+)
opValue Ops
Sub = (-)
opValue Ops
Mul = Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
(*)
opValue Ops
Div = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div
opValue Ops
Mod = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod
command :: Command -> Store -> (Integer,Store)
command :: Command -> Store -> (Integer, Store)
command Command
Null Store
st = (Integer
0 , Store
st)
command (Eval Expr
e) Store
st = (Expr -> Store -> Integer
eval Expr
e Store
st , Store
st)
command (Assign Var
v Expr
e) Store
st
= (Integer
val , Store
newSt)
where
val :: Integer
val = Expr -> Store -> Integer
eval Expr
e Store
st
newSt :: Store
newSt = Store -> Var -> Integer -> Store
update Store
st Var
v Integer
val