Merge pull request #440 from aasimk2000/add-nil-if-test
[jackhill/mal.git] / perl6 / env.pm
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 }