module Environments where {- Definitions from the Environments slides -} data Value = I Int | R Float -- or, whatever data Env = Env (String -> Value) tweek :: (String,Value) -> Env -> Env tweek (x,v) (Env rho) = Env (\ n -> if n==x then v else rho n) tweekList :: [(String,Value)] -> Env -> Env tweekList bindings env = foldr tweek env bindings emptyenv :: Env emptyenv = Env (\ x -> I 0) extendenv :: [String] -> [Value] -> Env -> Env extendenv vars vals (Env rho) = tweekList (zip vars vals) (Env rho) applyenv :: Env -> String -> Value applyenv (Env rho) x = rho x ----------------------------------- -- Making unbound things unbound -- ----------------------------------- data Env1 = Env1 (String -> Maybe Value) tweek1 :: (String,Value) -> Env1 -> Env1 tweek1 (x,v) (Env1 rho) = Env1 (\ n -> if n==x then Just v else rho n) tweekList1 :: [(String,Value)] -> Env1 -> Env1 tweekList1 bindings env = foldr tweek1 env bindings emptyenv1 :: Env1 emptyenv1 = Env1 (\ x -> Nothing) extendenv1 :: [String] -> [Value] -> Env1 -> Env1 extendenv1 vars vals (Env1 rho) = tweekList1 (zip vars vals) (Env1 rho) applyenv1 :: Env1 -> String -> Value applyenv1 (Env1 rho) x = case rho x of (Just v) -> v Nothing -> error (x ++ " is unbound") ----------------------------------- -- Making unbound things unbound -- ----------------------------------- data Env2 val = Env2 (String -> Maybe val) tweek2 :: (String,val) -> Env2 val -> Env2 val tweek2 (x,v) (Env2 rho) = Env2 (\ n -> if n==x then Just v else rho n) tweekList2 :: [(String,val)] -> Env2 val -> Env2 val tweekList2 bindings env = foldr tweek2 env bindings emptyenv2 :: Env2 val emptyenv2 = Env2 (\ x -> Nothing) extendenv2 :: [String] -> [val] -> Env2 val -> Env2 val extendenv2 vars vals (Env2 rho) = tweekList2 (zip vars vals) (Env2 rho) applyenv2 :: Env2 val -> String -> val applyenv2 (Env2 rho) x = case rho x of (Just v) -> v Nothing -> error (x ++ " is unbound") data FunVal = DefineYourself type Zee = Env2 Int type Rho = Env2 Int type Phi = Env2 FunVal data Exp = SeeTheSlides data ExpStore = ES Exp Zee Phi Rho data Store a = Str a Zee Phi Rho