cherry-lisp/src/Enviroment.hs

30 lines
1.2 KiB
Haskell
Raw Normal View History

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 :: String -> Enviroment -> Maybe Expr
lookupVar var (Enviroment menv upperEnv) = let mExpr = M.lookup var menv in
if isNothing mExpr then upperEnv >>= lookupVar var else mExpr
2021-01-30 17:09:05 +00:00
insertVar :: String -> Expr -> Enviroment -> Enviroment
insertVar var expr (Enviroment menv u) = Enviroment (M.insert var expr menv) u
emptyEnv :: Enviroment
emptyEnv = Enviroment M.empty Nothing
-- Returns a copy of the second enviroment whose upper enviroment is the first
extendEnv :: Enviroment -> Enviroment -> Enviroment
extendEnv upper (Enviroment menv Nothing) = Enviroment menv (Just upper)
extendEnv upper (Enviroment menv (Just upperMenv)) = Enviroment menv (Just $ extendEnv upperMenv upper)