Commit | Line | Data |
---|---|---|
a7081401 HÖS |
1 | unit class MalEnv; |
2 | use types; | |
3 | ||
4 | has $.outer; | |
5 | has %.data; | |
6 | has @.binds; | |
7 | has @.exprs; | |
8 | ||
9 | method new ($outer?, @binds?, @exprs?) { | |
10 | self.bless(:$outer, :@binds, :@exprs); | |
11 | } | |
12 | ||
13 | submethod BUILD (:@!binds, :@!exprs, :$!outer, :%!data) { | |
14 | for @!binds.kv -> $idx, $key { | |
15 | if $key eq '&' { | |
16 | my $value = MalList([@!exprs[$idx..*]]); | |
17 | self.set(@!binds[$idx+1], $value); | |
18 | last; | |
19 | } | |
20 | my $value = @!exprs[$idx]; | |
21 | self.set($key, $value); | |
22 | } | |
23 | } | |
24 | ||
25 | method set ($key, $value) { | |
26 | %.data{$key} = $value; | |
27 | } | |
28 | ||
29 | method find ($key) { | |
30 | return %.data{$key} ?? self !! $.outer && $.outer.find($key); | |
31 | } | |
32 | ||
33 | method get ($key) { | |
34 | my $env = self.find($key) or die X::MalNotFound.new(name => $key); | |
35 | return $env.data{$key}; | |
36 | } |