Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Perlito5 - js - implement 5.20 "hash slices"
  • Loading branch information
fglock committed May 28, 2014
1 parent 4de7011 commit b98fb26
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 0 deletions.
25 changes: 25 additions & 0 deletions html/perlito5.js
Expand Up @@ -12710,6 +12710,19 @@ return (p5context([(p5str((p5pkg["Perlito5::Javascript2::LexicalBlock"]["v__"] |
if ( ((p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Apply'], 0)) && (p5str((v_self || (v_self = new p5HashRef({})))._hash_.p5hget_hash('obj')._hash_.p5hget('code')) == 'prefix:<@>')) || (p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Var'], 0)) && (p5str(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "sigil", [], 0)) == '@'))) ) {
(function () { throw(p5context([('(function (a, v) { ' + 'var src=' + p5str(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "emit_javascript2", [v_level], 0)) + '; ' + 'for (var i=0, l=v.length; ' + 'i<l; ++i)' + '{ ' + 'a.push(src.' + p5str(v_method) + '(v[i])) ' + '}; ' + 'return a ' + '})(' + '[], ' + p5str(p5pkg["Perlito5::Javascript2"].to_list(p5list_to_a((new p5ArrayRef(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp')))), v_level), 0)) + ')')], p5want)) })();
};
if ( ((p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Apply'], 0)) && (p5str((v_self || (v_self = new p5HashRef({})))._hash_.p5hget_hash('obj')._hash_.p5hget('code')) == 'prefix:<%>')) || (p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Var'], 0)) && (p5str(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "sigil", [], 0)) == '%'))) ) {
(function () {
var v_obj;
v_obj = ((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'));
if ( (p5str((v_obj || (v_obj = new p5HashRef({})))._hash_.p5hget('sigil')) == '%') ) {
(v_obj || (v_obj = new p5HashRef({})))._hash_.p5hset('sigil', ('@'))
};
if ( (p5str((v_obj || (v_obj = new p5HashRef({})))._hash_.p5hget('code')) == 'prefix:<%>') ) {
(v_obj || (v_obj = new p5HashRef({})))._hash_.p5hset('code', ('prefix:<@>'))
};
(function () { throw(p5context([('(function (a, v) { ' + 'var src=' + p5str(p5call(v_obj, "emit_javascript2", [v_level], 0)) + '; ' + 'for (var i=0, l=v.length; ' + 'i<l; ++i)' + '{ ' + 'a.push(v[i]); ' + 'a.push(src.' + p5str(v_method) + '(v[i])) ' + '}; ' + 'return a ' + '})(' + '[], ' + p5str(p5pkg["Perlito5::Javascript2"].to_list(p5list_to_a((new p5ArrayRef(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp')))), v_level), 0)) + ')')], p5want)) })();
})();
};
return (p5context([(p5str(p5call(v_self, "emit_javascript2_container", [v_level], 0)) + '.' + p5str(v_method) + '(' + p5str(p5pkg["Perlito5::Javascript2"].to_num(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp'), v_level), 0)) + ')')], p5want));
}
catch(err) {
Expand Down Expand Up @@ -12831,6 +12844,18 @@ return (p5context([(p5str((p5pkg["Perlito5::Javascript2::LexicalBlock"]["v__"] |
(function () { throw(p5context([('(function (a, v) { ' + 'var src=' + p5str(p5call(v_v, "emit_javascript2", [v_level], 0)) + '; ' + 'for (var i=0, l=v.length; ' + 'i<l; ++i)' + '{ ' + 'a.push(src.p5hget(v[i])) ' + '}; ' + 'return a ' + '})(' + '[], ' + p5str(p5pkg["Perlito5::Javascript2"].to_list(p5list_to_a((new p5ArrayRef(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp')))), v_level), 0)) + ')')], p5want)) })();
})();
};
if ( ((p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Apply'], 0)) && (p5str((v_self || (v_self = new p5HashRef({})))._hash_.p5hget_hash('obj')._hash_.p5hget('code')) == 'prefix:<%>')) || (p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Var'], 0)) && (p5str(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "sigil", [], 0)) == '%'))) ) {
(function () {
var v_v;
if ( p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Var'], 0)) ) {
v_v = (p5call(p5pkg["Perlito5::AST::Var"], "new", p5list_to_a('sigil', '%', 'namespace', p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "namespace", [], 1), 'name', p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "name", [], 1)), 0))
};
if ( p5bool(p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "isa", ['Perlito5::AST::Apply'], 0)) ) {
v_v = (p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('code', 'prefix:<%>', 'namespace', p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "namespace", [], 1), 'arguments', p5call((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('obj'), "arguments", [], 1)), 0))
};
(function () { throw(p5context([('(function (a, v) { ' + 'var src=' + p5str(p5call(v_v, "emit_javascript2", [v_level], 0)) + '; ' + 'for (var i=0, l=v.length; ' + 'i<l; ++i)' + '{ ' + 'a.push(v[i]); ' + 'a.push(src.p5hget(v[i])) ' + '}; ' + 'return a ' + '})(' + '[], ' + p5str(p5pkg["Perlito5::Javascript2"].to_list(p5list_to_a((new p5ArrayRef(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp')))), v_level), 0)) + ')')], p5want)) })();
})();
};
return (p5context([(p5str(p5call(v_self, "emit_javascript2_container", [v_level], 0)) + '.' + p5str(v_method) + '(' + p5str(p5pkg["Perlito5::Javascript2"].autoquote(p5list_to_a((v_self || (v_self = new p5HashRef({})))._hash_.p5hget('index_exp'), v_level), 0)) + ')')], p5want));
}
catch(err) {
Expand Down
16 changes: 16 additions & 0 deletions perlito5.pl
Expand Up @@ -9043,6 +9043,14 @@ package Perlito5::AST::Index;
if (($self->{'obj'}->isa('Perlito5::AST::Apply') && $self->{'obj'}->{'code'} eq 'prefix:<@>') || ($self->{'obj'}->isa('Perlito5::AST::Var') && $self->{'obj'}->sigil() eq '@')) {
return '(function (a, v) { ' . 'var src=' . $self->{'obj'}->emit_javascript2($level) . '; ' . 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ ' . 'a.push(src.' . $method . '(v[i])) ' . '}; ' . 'return a ' . '})(' . '[], ' . Perlito5::Javascript2::to_list([$self->{'index_exp'}], $level) . ')'
}
if (($self->{'obj'}->isa('Perlito5::AST::Apply') && $self->{'obj'}->{'code'} eq 'prefix:<%>') || ($self->{'obj'}->isa('Perlito5::AST::Var') && $self->{'obj'}->sigil() eq '%')) {
my $obj = $self->{'obj'};
$obj->{'sigil'} = '@'
if $obj->{'sigil'} eq '%';
$obj->{'code'} = 'prefix:<@>'
if $obj->{'code'} eq 'prefix:<%>';
return '(function (a, v) { ' . 'var src=' . $obj->emit_javascript2($level) . '; ' . 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ ' . 'a.push(v[i]); ' . 'a.push(src.' . $method . '(v[i])) ' . '}; ' . 'return a ' . '})(' . '[], ' . Perlito5::Javascript2::to_list([$self->{'index_exp'}], $level) . ')'
}
return $self->emit_javascript2_container($level) . '.' . $method . '(' . Perlito5::Javascript2::to_num($self->{'index_exp'}, $level) . ')'
}
sub Perlito5::AST::Index::emit_javascript2_set {
Expand Down Expand Up @@ -9102,6 +9110,14 @@ package Perlito5::AST::Lookup;
if $self->{'obj'}->isa('Perlito5::AST::Apply');
return '(function (a, v) { ' . 'var src=' . $v->emit_javascript2($level) . '; ' . 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ ' . 'a.push(src.p5hget(v[i])) ' . '}; ' . 'return a ' . '})(' . '[], ' . Perlito5::Javascript2::to_list([$self->{'index_exp'}], $level) . ')'
}
if (($self->{'obj'}->isa('Perlito5::AST::Apply') && $self->{'obj'}->{'code'} eq 'prefix:<%>') || ($self->{'obj'}->isa('Perlito5::AST::Var') && $self->{'obj'}->sigil() eq '%')) {
my $v;
$v = Perlito5::AST::Var->new('sigil' => '%', 'namespace' => $self->{'obj'}->namespace(), 'name' => $self->{'obj'}->name())
if $self->{'obj'}->isa('Perlito5::AST::Var');
$v = Perlito5::AST::Apply->new('code' => 'prefix:<%>', 'namespace' => $self->{'obj'}->namespace(), 'arguments' => $self->{'obj'}->arguments())
if $self->{'obj'}->isa('Perlito5::AST::Apply');
return '(function (a, v) { ' . 'var src=' . $v->emit_javascript2($level) . '; ' . 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ ' . 'a.push(v[i]); ' . 'a.push(src.p5hget(v[i])) ' . '}; ' . 'return a ' . '})(' . '[], ' . Perlito5::Javascript2::to_list([$self->{'index_exp'}], $level) . ')'
}
return $self->emit_javascript2_container($level) . '.' . $method . '(' . Perlito5::Javascript2::autoquote($self->{'index_exp'}, $level) . ')'
}
sub Perlito5::AST::Lookup::emit_javascript2_set {
Expand Down
61 changes: 61 additions & 0 deletions src5/lib/Perlito5/Javascript2/Emitter.pm
Expand Up @@ -791,6 +791,38 @@ package Perlito5::AST::Index;
. Perlito5::Javascript2::to_list([$self->{index_exp}], $level)
. ')';
}
if ( ( $self->{obj}->isa('Perlito5::AST::Apply')
&& $self->{obj}->{code} eq 'prefix:<%>'
)
|| ( $self->{obj}->isa('Perlito5::AST::Var')
&& $self->{obj}->sigil eq '%'
)
)
{
# Perl5.20 hash slice
# %a[10, 20]
# %$a[0, 2] ==> %{$a}[0,2]

# "fix" the sigil type
my $obj = $self->{obj};
$obj->{sigil} = '@'
if $obj->{sigil} eq '%';
$obj->{code} = 'prefix:<@>'
if $obj->{code} eq 'prefix:<%>';

return
'(function (a, v) { '
. 'var src=' . $obj->emit_javascript2($level) . '; '
. 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ '
. 'a.push(v[i]); '
. 'a.push(src.' . $method . '(v[i])) '
. '}; '
. 'return a '
. '})('
. '[], '
. Perlito5::Javascript2::to_list([$self->{index_exp}], $level)
. ')';
}
return $self->emit_javascript2_container($level) . '.' . $method . '('
. Perlito5::Javascript2::to_num($self->{index_exp}, $level)
. ')';
Expand Down Expand Up @@ -929,6 +961,35 @@ package Perlito5::AST::Lookup;
. Perlito5::Javascript2::to_list([$self->{index_exp}], $level)
. ')';
}
if ( ( $self->{obj}->isa('Perlito5::AST::Apply')
&& $self->{obj}->{code} eq 'prefix:<%>'
)
|| ( $self->{obj}->isa('Perlito5::AST::Var')
&& $self->{obj}->sigil eq '%'
)
)
{
# Perl5.20 hash slice
# %a{ 'x', 'y' }
# %$a{ 'x', 'y' } ==> %{$a}{ 'x', 'y' }
my $v;
$v = Perlito5::AST::Var->new( sigil => '%', namespace => $self->{obj}->namespace, name => $self->{obj}->name )
if $self->{obj}->isa('Perlito5::AST::Var');
$v = Perlito5::AST::Apply->new( code => 'prefix:<%>', namespace => $self->{obj}->namespace, arguments => $self->{obj}->arguments )
if $self->{obj}->isa('Perlito5::AST::Apply');
return
'(function (a, v) { '
. 'var src=' . $v->emit_javascript2($level) . '; '
. 'for (var i=0, l=v.length; ' . 'i<l; ++i)' . '{ '
. 'a.push(v[i]); '
. 'a.push(src.p5hget(v[i])) '
. '}; '
. 'return a '
. '})('
. '[], '
. Perlito5::Javascript2::to_list([$self->{index_exp}], $level)
. ')';
}
return $self->emit_javascript2_container($level) . '.' . $method . '('
. Perlito5::Javascript2::autoquote($self->{index_exp}, $level)
. ')';
Expand Down

0 comments on commit b98fb26

Please sign in to comment.