Commit | Line | Data |
---|---|---|
b5f469de JM |
1 | class Env |
2 | attr_accessor :data | |
3 | def initialize(outer=nil, binds=[], exprs=[]) | |
4 | @data = {} | |
5 | @outer = outer | |
8bf53bec JM |
6 | binds.each_index do |i| |
7 | if binds[i] == :"&" | |
8 | data[binds[i+1]] = exprs.drop(i) | |
9 | break | |
10 | else | |
11 | data[binds[i]] = exprs[i] | |
12 | end | |
13 | end | |
14 | return self | |
b5f469de JM |
15 | end |
16 | ||
17 | def find(key) | |
18 | if @data.key? key | |
19 | return self | |
20 | elsif @outer | |
21 | return @outer.find(key) | |
22 | else | |
23 | return nil | |
24 | end | |
25 | end | |
26 | ||
27 | def set(key, value) | |
28 | @data[key] = value | |
29 | return value | |
30 | end | |
31 | ||
32 | def get(key) | |
33 | env = find(key) | |
34 | raise "'" + key.to_s + "' not found" if not env | |
35 | env.data[key] | |
36 | end | |
37 | end |