Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Perlito5 - 'use constant' - wip
  • Loading branch information
fglock committed Jun 2, 2014
1 parent 94274ab commit 67df646
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
20 changes: 20 additions & 0 deletions html/perlito5.js
Expand Up @@ -8223,6 +8223,26 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', ((v_m || (v_m = new p5HashRef({})))._hash_.p5hget('capture')));
})();
}
else if ( (((p5str(v_use_decl) == 'use') && (p5str(v_full_ident) == 'constant')) && p5bool(v_list)) ) {
(function () {
var List_ast= [];
p5while(function () {
var v_name;
v_name = ((v_list || (v_list = new p5ArrayRef([])))._array_.shift());
var v_val;
v_val = ((v_list || (v_list = new p5ArrayRef([])))._array_.shift());
var v_code;
v_code = (('sub ' + p5str(v_name) + ' () { ' + p5str(p5pkg["Perlito5::Dumper"]._dumper([v_val], 0)) + ' }'));
var v_m;
v_m = (p5call(p5pkg["Perlito5::Grammar::Statement"], "statement_parse", [v_code, 0], 0));
if ( !( p5bool(v_m)) ) {
p5pkg["Perlito5::Grammar::Use"].die([[('not a valid constant: ' + p5pkg["Perlito5::Grammar::Use"].join([p5pkg["main"]["v_\""], p5list_to_a((v_list || (v_list = new p5ArrayRef([])))._array_)], 0))]], null)
};
List_ast.p5push(p5list_to_a((v_m || (v_m = new p5HashRef({})))._hash_.p5hget('capture')));
}, function () { return (v_list || (v_list = new p5ArrayRef([])))._array_ }, false, "");
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', (p5call(p5pkg["Perlito5::AST::Lit::Block"], "new", p5list_to_a('stmts', (new p5ArrayRef(List_ast))), 0)));
})();
}
else {
(function () {
var v_ast;
Expand Down
13 changes: 13 additions & 0 deletions perlito5.pl
Expand Up @@ -5230,6 +5230,19 @@ sub Perlito5::Grammar::Use::stmt_use {
if !$m;
$MATCH->{'capture'} = $m->{'capture'}
}
elsif ($use_decl eq 'use' && $full_ident eq 'constant' && $list) {
my @ast;
while (@{$list}) {
my $name = shift(@{$list});
my $val = shift(@{$list});
my $code = 'sub ' . $name . ' () { ' . Perlito5::Dumper::_dumper($val) . ' }';
my $m = Perlito5::Grammar::Statement->statement_parse($code, 0);
die('not a valid constant: ' . join(${'"'}, @{$list}))
if !$m;
push(@ast, $m->{'capture'})
}
$MATCH->{'capture'} = Perlito5::AST::Lit::Block->new('stmts' => \@ast)
}
else {
my $ast = Perlito5::AST::Use->new('code' => $use_decl, 'mod' => $full_ident, 'arguments' => $list);
parse_time_eval($ast);
Expand Down
18 changes: 16 additions & 2 deletions src5/lib/Perlito5/Grammar/Use.pm
Expand Up @@ -18,6 +18,7 @@ my %Perlito_internal_module = (
Carp => 'Perlito5::Carp',
'Data::Dumper' => 'Perlito5::Dumper',
# vars => 'Perlito5::vars', # this is "hardcoded" in stmt_use()
# constant => 'Perlito5::constant',
);


Expand Down Expand Up @@ -65,13 +66,26 @@ token stmt_use {

if ($use_decl eq 'use' && $full_ident eq 'vars' && $list) {
my $code = 'our (' . join(', ', @$list) . ')';
#say "will do: $code";
my $m = Perlito5::Grammar::Statement->statement_parse($code, 0);
die "not a valid variable name: @$list"
if !$m;
#say Perlito5::Dumper::Dumper($m->{capture});
$MATCH->{capture} = $m->{capture};
}
elsif ($use_decl eq 'use' && $full_ident eq 'constant' && $list) {
my @ast;
while (@$list) {
my $name = shift @$list;
my $val = shift @$list;
my $code = 'sub ' . $name . ' () { ' . Perlito5::Dumper::_dumper($val) . ' }';
# say "will do: $code";
my $m = Perlito5::Grammar::Statement->statement_parse($code, 0);
die "not a valid constant: @$list"
if !$m;
# say Perlito5::Dumper::Dumper($m->{capture});
push @ast, $m->{capture};
}
$MATCH->{capture} = Perlito5::AST::Lit::Block->new( stmts => \@ast );
}
else {
my $ast = Perlito5::AST::Use->new(
code => $use_decl,
Expand Down

0 comments on commit 67df646

Please sign in to comment.