34 lines
593 B
OCaml
34 lines
593 B
OCaml
|
module Value = Ast.Value
|
||
|
|
||
|
type t = {
|
||
|
vars : (string, Value.t) Hashtbl.t;
|
||
|
parent : t option;
|
||
|
}
|
||
|
|
||
|
let init_global () = {
|
||
|
vars = Hashtbl.create 100;
|
||
|
parent = None;
|
||
|
}
|
||
|
|
||
|
let make parent = {
|
||
|
vars = Hashtbl.create 100;
|
||
|
parent = Some parent;
|
||
|
}
|
||
|
|
||
|
exception Not_found
|
||
|
|
||
|
let rec get e name =
|
||
|
match Hashtbl.find_opt e.vars name with
|
||
|
| None -> begin match e.parent with
|
||
|
| None -> raise Not_found
|
||
|
| Some p -> get p name
|
||
|
end
|
||
|
| Some value -> value
|
||
|
|
||
|
let get_opt e name =
|
||
|
try Some (get e name)
|
||
|
with Not_found -> None
|
||
|
|
||
|
let set e name value =
|
||
|
Hashtbl.replace e.vars name value
|