-----------------------------------------------------------------------
--
--  Haskell: The Craft of Functional Programming
--  Simon Thompson
--  (c) Addison-Wesley, 1996-2011.
--
--  CalcEval.hs
--
--  Evaluating expressions and commands
--
-----------------------------------------------------------------------


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