2021-01-30 17:09:05 +00:00
|
|
|
module Enviroment where
|
|
|
|
|
|
|
|
import qualified Data.Map as M
|
2021-01-30 21:38:44 +00:00
|
|
|
import Expression
|
2021-01-30 17:09:05 +00:00
|
|
|
import Data.Maybe
|
|
|
|
|
|
|
|
data Enviroment = Enviroment (M.Map String Expr) (Maybe Enviroment)
|
|
|
|
|
2021-01-30 21:38:44 +00:00
|
|
|
-- The base enviroment, that contains the main functions and variables
|
2021-01-30 17:09:05 +00:00
|
|
|
base :: Enviroment
|
|
|
|
base = Enviroment (M.fromList [
|
2021-01-30 21:38:44 +00:00
|
|
|
("id", LambdaE "x" $ VarE "x"), -- Given a expression, returns the same expression
|
|
|
|
("const", LambdaE "x" $ LambdaE "y" $ VarE "x") -- Given two expressions, returns the first expression
|
2021-01-30 17:09:05 +00:00
|
|
|
]) Nothing
|
|
|
|
|
|
|
|
lookupVar :: Enviroment -> String -> Maybe Expr
|
|
|
|
lookupVar (Enviroment menv upperEnv) var = let mExpr = M.lookup var menv in
|
|
|
|
if isNothing mExpr then upperEnv >>= (`lookupVar` var) else mExpr
|
|
|
|
|
|
|
|
insertVar :: Enviroment -> String -> Expr -> Enviroment
|
|
|
|
insertVar (Enviroment menv u) var expr = Enviroment (M.insert var expr menv) u
|
2021-01-30 19:21:25 +00:00
|
|
|
|
|
|
|
emptyEnv :: Enviroment
|
|
|
|
emptyEnv = Enviroment M.empty Nothing
|
|
|
|
|
2021-01-30 21:38:44 +00:00
|
|
|
-- Returns a copy of the first enviroment whose upper enviroment is the second
|
2021-01-30 19:21:25 +00:00
|
|
|
extendEnv :: Enviroment -> Enviroment -> Enviroment
|
|
|
|
extendEnv (Enviroment menv Nothing) upper = Enviroment menv (Just upper)
|
|
|
|
extendEnv (Enviroment menv (Just upperMenv)) upper = Enviroment menv (Just $ extendEnv upperMenv upper)
|