Runtest should fail on bad test data. Fix interop tests.
[jackhill/mal.git] / perl6 / env.pm
CommitLineData
a7081401
HÖS
1unit class MalEnv;
2use types;
3
4has $.outer;
5has %.data;
6has @.binds;
7has @.exprs;
8
9method new ($outer?, @binds?, @exprs?) {
10 self.bless(:$outer, :@binds, :@exprs);
11}
12
13submethod 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
25method set ($key, $value) {
26 %.data{$key} = $value;
27}
28
29method find ($key) {
30 return %.data{$key} ?? self !! $.outer && $.outer.find($key);
31}
32
33method get ($key) {
34 my $env = self.find($key) or die X::MalNotFound.new(name => $key);
35 return $env.data{$key};
36}