module FunctionalEnvironment where
import Data.Maybe
import Value
import IntBool
emptyEnvF :: EnvF
emptyEnvF = \var -> Nothing
bindF :: String -> a -> (String -> Maybe a) -> (String -> Maybe a)
bindF var val env = \testVar -> if testVar == var
then Just val
else env testVar
type EnvF = String -> Maybe Value
-- Evaluate an expression in a (functional) environment
evaluateF :: Exp -> EnvF -> Value
evaluateF (Literal v) env = v
evaluateF (Unary op a) env = unary op (evaluateF a env)
evaluateF (Binary op a b) env = binary op (evaluateF a env) (evaluateF b env)
evaluateF (Variable x) env = fromJust (env x) -- changed
evaluateF (Declare x exp body) env = evaluateF body newEnv
where newEnv = bindF x (evaluateF exp env) env -- changed