blob: 21b2d4b2425408cf55eb41d3a399bc42981e9781 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
module Haskell.Env where
import Control.Monad
import qualified Data.Map.Strict as Map
import Haskell.AST
data Env = Env { eDefs :: Map.Map Name Expr }
deriving (Show)
emptyEnv :: Env
emptyEnv = Env Map.empty
envFromAST :: AST -> Either String Env
envFromAST = addAST emptyEnv
addAST :: Env -> AST -> Either String Env
addAST env (AST tops) = foldM addTop env tops
addTop :: Env -> Toplevel -> Either String Env
addTop env (TopDef (Def n ex)) =
Right $ env { eDefs = Map.insert n ex (eDefs env) }
addTop _ _ = Left "Only plain top-level definitions supported for the moment"
forget :: Name -> Env -> Either String Env
forget name env =
if Map.member name (eDefs env)
then Right $ env { eDefs = Map.delete name (eDefs env) }
else Left $ "Name '" ++ name ++ "' not found in environment"
|