ref: 5fa933a00fd0a280221439c54a246600d454ecc7
dir: /env.ml/
module T = Types.Types
module Data = Map.Make (String)
type env =
{ outer : env option
; data : Types.m9type Data.t ref
}
let make outer = { outer; data = ref Data.empty }
let set env sym value =
match sym with
| T.Symbol { T.value = key } -> env.data := Data.add key value !(env.data)
| _ -> raise (Invalid_argument "set: not a symbol")
;;
let rec find env sym =
match sym with
| T.Symbol { T.value = key } ->
if Data.mem key !(env.data)
then Some env
else (
match env.outer with
| Some outer -> find outer sym
| None -> None)
| _ -> raise (Invalid_argument "find: not a symbol")
;;
let get env sym =
match sym with
| T.Symbol { T.value = key } ->
(match find env sym with
| Some found_env -> Data.find key !(found_env.data)
| None -> raise (Invalid_argument ("'" ^ key ^ "' not found")))
| _ -> raise (Invalid_argument "get: not a symbol")
;;