Haxe: step7-A, hash-maps, metadata, self-hosting.
[jackhill/mal.git] / julia / env.jl
1 module env
2
3 export Env, env_set, env_find, env_get
4
5 type Env
6 outer::Any
7 data::Dict{Symbol,Any}
8 end
9
10 function Env()
11 Env(nothing, Dict())
12 end
13
14 function Env(outer)
15 Env(outer, Dict())
16 end
17
18 function Env(outer, binds, exprs)
19 e = Env(outer, Dict())
20 for i=1:length(binds)
21 if binds[i] == :&
22 e.data[binds[i+1]] = exprs[i:end]
23 break
24 else
25 e.data[binds[i]] = exprs[i]
26 end
27 end
28 e
29 end
30
31
32 function env_set(env::Env, k::Symbol, v)
33 env.data[k] = v
34 end
35
36 function env_find(env::Env, k::Symbol)
37 if haskey(env.data, k)
38 env
39 elseif env.outer != nothing
40 env_find(env.outer, k)
41 else
42 nothing
43 end
44 end
45
46 function env_get(env::Env, k::Symbol)
47 e = env_find(env, k)
48 if e != nothing
49 e.data[k]
50 else
51 error("'$(string(k))' not found")
52 end
53 end
54
55 end