
-- 	
-- 	Eval.lhs

-- 	Evaluating expressions and commands

-- 	(c) Simon Thompson, 1998.

module Eval where

import Types
import Store

eval :: Expr -> Store -> Int

eval (Lit n) st = n
eval (Var v) st = value st v
eval (Op op e1 e2) st
  = opValue op v1 v2
    where
    v1 = eval e1 st
    v2 = eval e2 st

opValue :: Ops -> Int -> Int -> Int

opValue Add = (+)
opValue Sub = (-) 
opValue Mul = (*) 
opValue Div = div 
opValue Mod = mod

command :: Command -> Store -> (Int,Store)

command Null st     = (0 , st)
command (Eval e) st = (eval e st , st)
command (Assign v e) st 
  = (val , newSt)
    where
    val   = eval e st
    newSt = update st v val


