2 module Data
= Map.Make
(String
)
6 data
: Types.mal_type
Data.t
ref;
9 let make outer
= { outer
= outer
; data
= ref Data.empty
}
11 let set env sym
value =
13 | T.Symbol
{ T.value = key
} -> env
.data
:= Data.add key
value !(env
.data
)
14 | _
-> raise
(Invalid_argument
"set requires a Symbol for its key")
16 let rec find env sym
=
18 | T.Symbol
{ T.value = key
} ->
19 (if Data.mem key
!(env
.data
) then
23 | Some outer
-> find outer sym
25 | _
-> raise
(Invalid_argument
"find requires a Symbol for its key")
29 | T.Symbol
{ T.value = key
} ->
30 (match find env sym
with
31 | Some found_env
-> Data.find key
!(found_env
.data
)
32 | None
-> raise
(Invalid_argument
("'" ^ key ^
"' not found")))
33 | _
-> raise
(Invalid_argument
"get requires a Symbol for its key")