mirror of
https://github.com/kanaka/mal.git
synced 2024-10-27 06:40:14 +03:00
61 lines
1.2 KiB
Perl
61 lines
1.2 KiB
Perl
package Env;
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Exporter 'import';
|
|
our @EXPORT_OK = ();
|
|
|
|
use Types;
|
|
|
|
sub new {
|
|
my ( $class, $outer, $binds, $exprs ) = @_;
|
|
my $data = { __outer__ => $outer };
|
|
if ($binds) {
|
|
for my $i ( 0 .. $#{$binds} ) {
|
|
if ( ${ $binds->[$i] } eq q{&} ) {
|
|
|
|
# variable length arguments
|
|
$data->{ ${ $binds->[ $i + 1 ] } } =
|
|
Mal::List->new( [ @{$exprs}[ $i .. $#{$exprs} ] ] );
|
|
last;
|
|
}
|
|
$data->{ ${ $binds->[$i] } } = $exprs->[$i];
|
|
}
|
|
}
|
|
return bless $data => $class;
|
|
}
|
|
|
|
sub get {
|
|
my ( $self, $key ) = @_;
|
|
while ( not $self->{$key} ) {
|
|
$self = $self->{__outer__} // return;
|
|
}
|
|
return $self->{$key};
|
|
}
|
|
|
|
## no critic (NamingConventions::ProhibitAmbiguousNames)
|
|
sub set {
|
|
## use critic
|
|
my ( $self, $key, $value ) = @_;
|
|
$self->{$key} = $value;
|
|
return $value;
|
|
}
|
|
|
|
#my $e1 = Env->new();
|
|
#print Dumper($e1);
|
|
#
|
|
#my $e2 = Env->new();
|
|
#$e2->set('abc', 123);
|
|
#$e2->set('def', 456);
|
|
#print Dumper($e2);
|
|
#
|
|
#my $e3 = Env->new($e2);
|
|
#$e3->set('abc', 789);
|
|
#$e3->set('ghi', 1024);
|
|
#print Dumper($e3);
|
|
#
|
|
#print Dumper($e3->get('abc'));
|
|
#print Dumper($e3->get('def'));
|
|
|
|
1;
|