Language-Expr
view release on metacpan or search on metacpan
lib/Language/Expr/Interpreter/default.pm view on Meta::CPAN
$self->rule_subscripting_expr(%args);
}
sub rule_subscripting_expr {
my ($self, %args) = @_;
my $match = $args{match};
my $res = $match->{operand};
for my $i (@{$match->{subscript}}) {
if (ref($res) eq 'ARRAY' ) { $res = $res->[$i] }
elsif (ref($res) eq 'HASH') { $res = $res->{$i} }
else { die "Invalid subscript on nonhash/nonarray" }
}
$res;
}
sub rule_array {
my ($self, %args) = @_;
my $match = $args{match};
$match->{element};
}
sub rule_hash {
my ($self, %args) = @_;
my $match = $args{match};
return { map { $_->[0] => $_->[1] } @{ $match->{pair} } }
}
sub rule_undef {
my ($self, %args) = @_;
my $match = $args{match};
undef;
}
sub rule_squotestr {
my ($self, %args) = @_;
join("",
map { $_->{value} }
@{ $self->parse_squotestr($args{match}{part}) });
}
sub rule_dquotestr {
my ($self, %args) = @_;
join("",
map { $_->{type} eq 'VAR' ?
$self->rule_var(match=>{var=>$_->{value}}) :
$_->{value}
}
@{ $self->parse_dquotestr($args{match}{part}) });
}
sub rule_bool {
my ($self, %args) = @_;
my $match = $args{match};
if ($match->{bool} eq 'true') { true } else { false }
}
sub rule_num {
my ($self, %args) = @_;
my $match = $args{match};
if ($match->{num} eq 'inf') { "Inf"+0 }
elsif ($match->{num} eq 'nan') { "NaN"+0 }
else { $match->{num}+0 }
}
sub rule_var {
my ($self, %args) = @_;
my $match = $args{match};
$self->vars->{ $match->{var} };
}
sub rule_func {
my ($self, %args) = @_;
my $match = $args{match};
my $f = $match->{func_name};
my $args = $match->{args};
my $res;
if ($self->funcs->{$f}) {
return $self->funcs->{$f}->(@$args);
} else {
die "Unknown function $f";
}
}
sub _map_grep_usort {
my ($self, $which, %args) = @_;
my $match = $args{match};
my $ary = $match->{array};
my $expr = $match->{expr};
die "Second argument to map/grep/usort must be an array"
unless ref($ary) eq 'ARRAY';
local $self->{level} = $self->{level}+1;
#print "DEBUG: _map_grep_usort: level=$self->{level}, expr=`$expr`, array=[".join(",", @$ary),"]\n";
my $res;
if ($which eq 'map') {
$res = [];
local $self->{vars}{_};
for (@$ary) {
$self->{vars}{_} = $_;
push @$res, Language::Expr::Parser::parse_expr($expr, $self,
$self->level);
push @$res, $_;
}
} elsif ($which eq 'grep') {
local $self->{vars}{_};
$res = [ grep {
$self->{vars}{_} = $_;
$self->Language::Expr::Parser::parse_expr($expr, $self,
$self->level)
} @$ary];
} elsif ($which eq 'usort') {
local $self->{vars}{a};
local $self->{vars}{b};
$res = [ sort {
$self->{vars}{a} = $a;
$self->{vars}{b} = $b;
Language::Expr::Parser::parse_expr($expr, $self,
$self->level)
} @$ary];
}
$res;
}
( run in 0.647 second using v1.01-cache-2.11-cpan-39bf76dae61 )