Language-Expr
view release on metacpan or search on metacpan
lib/Language/Expr/Compiler/js.pm view on Meta::CPAN
my $match = $args{match};
my $opd = $match->{operand};
my @ss = @{$match->{subscript}//=[]};
return $opd unless @ss;
my $res;
for my $s (@ss) {
$opd = $res if defined($res);
$res = $opd . "[$s]";
}
$res;
}
sub rule_array {
my ($self, %args) = @_;
my $match = $args{match};
"[" . join(", ", @{ $match->{element} }) . "]";
}
sub rule_hash {
my ($self, %args) = @_;
my $match = $args{match};
"{" . join(", ", @{ $match->{pair} }). "}";
}
sub rule_undef {
"null";
}
sub rule_squotestr {
my ($self, %args) = @_;
join(" + ",
map { $self->_quote($_->{value}) }
@{ $self->parse_squotestr($args{match}{part}) });
}
sub rule_dquotestr {
my ($self, %args) = @_;
my @tmp =
map { $_->{type} eq 'VAR' ?
$self->rule_var(match=>{var=>$_->{value}}) :
$self->_quote($_->{value})
}
@{ $self->parse_dquotestr($args{match}{part}) };
if (@tmp > 1) {
"(". join(" + ", @tmp) . ")[0]";
} else {
$tmp[0];
}
}
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') { 'Infinity' }
elsif ($match->{num} eq 'nan') { 'NaN' }
else { $match->{num}+0 }
}
sub rule_var {
my ($self, %args) = @_;
my $match = $args{match};
if ($self->hook_var) {
my $res = $self->hook_var->($match->{var});
return $res if defined($res);
}
return "$match->{var}";
}
sub rule_func {
my ($self, %args) = @_;
my $match = $args{match};
my $f = $match->{func_name};
my $args = $match->{args};
if ($self->hook_func) {
my $res = $self->hook_func->($f, @$args);
return $res if defined($res);
}
my $fmap = $self->func_mapping->{$f};
$f = $fmap if $fmap;
my $fc = substr($f, 0, 1);
if ($fc eq '.') {
my $invoc = shift @$args;
return "($invoc)$f(".join(", ", @$args).")";
} elsif ($fc eq ':') {
my $invoc = shift @$args;
my $prop = substr($f, 1, length($f)-1);
return "($invoc).$prop";
} else {
return "$f(".join(", ", @$args).")";
}
}
sub _map_grep_usort {
my ($self, $which, %args) = @_;
my $match = $args{match};
my $ary = $match->{array};
my $expr = $match->{expr};
my $uuid = $self->new_marker('subexpr', $expr);
if ($which eq 'map') {
return "($ary).map(function(_){ return (TODO-$uuid); })";
} elsif ($which eq 'grep') {
return "($ary).filter(function(_){ return (TODO-$uuid); })";
} elsif ($which eq 'usort') {
return "($ary).sort(function(a, b){ return (TODO-$uuid); })";
}
}
sub rule_func_map {
my ($self, %args) = @_;
$self->_map_grep_usort('map', %args);
}
sub rule_func_grep {
my ($self, %args) = @_;
( run in 0.409 second using v1.01-cache-2.11-cpan-39bf76dae61 )