crystal: refactor member names and errors
[jackhill/mal.git] / crystal / env.cr
1 require "./types"
2 require "./error"
3
4 module Mal
5
6 class Env
7 property data
8
9 def initialize(@outer)
10 @data = {} of String => Mal::Type
11 end
12
13 def initialize(@outer, binds, exprs : Array(Mal::Type))
14 @data = {} of String => Mal::Type
15
16 eval_error "binds must be list or vector" unless binds.is_a? Array
17
18 # Note:
19 # Array#zip() can't be used because overload resolution failed
20 (0...binds.size).each do |idx|
21 sym, expr = binds[idx].unwrap, exprs[idx]
22 eval_error "bind list must be symbol" unless sym.is_a? Mal::Symbol
23 @data[sym.str] = expr
24 end
25 end
26
27 def set(key, value)
28 @data[key] = value
29 end
30
31 def find(key)
32 return self if @data.has_key? key
33
34 o = @outer
35 if o
36 o.find key
37 else
38 nil
39 end
40 end
41
42 def get(key)
43 e = find(key)
44 eval_error "#{key} not found" unless e
45 e.data[key]
46 end
47 end
48
49 end