# Do not edit this file - Generated by Perlito 7.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito::Perl5::Runtime;
use Perlito::Perl5::Prelude;
our $MATCH = Perlito::Match->new();
{
package GLOBAL;
sub new { shift; bless { @_ }, "GLOBAL" }
# use v6
;
{
package CompUnit;
sub new { shift; bless { @_ }, "CompUnit" }
sub name { $_[0]->{name} };
sub body { $_[0]->{body} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $stmt ( @{$self->{body}} ) {
$stmt->eval($env1)
}
}
}
;
{
package Val::Int;
sub new { shift; bless { @_ }, "Val::Int" }
sub int { $_[0]->{int} };
sub eval {
my $self = $_[0];
my $env = $_[1];
0+($self->{int})
}
}
;
{
package Val::Bit;
sub new { shift; bless { @_ }, "Val::Bit" }
sub bit { $_[0]->{bit} };
sub eval {
my $self = $_[0];
my $env = $_[1];
$self->{bit}
}
}
;
{
package Val::Num;
sub new { shift; bless { @_ }, "Val::Num" }
sub num { $_[0]->{num} };
sub eval {
my $self = $_[0];
my $env = $_[1];
0+($self->{num})
}
}
;
{
package Val::Buf;
sub new { shift; bless { @_ }, "Val::Buf" }
sub buf { $_[0]->{buf} };
sub eval {
my $self = $_[0];
my $env = $_[1];
$self->{buf}
}
}
;
{
package Lit::Block;
sub new { shift; bless { @_ }, "Lit::Block" }
sub sig { $_[0]->{sig} };
sub stmts { $_[0]->{stmts} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $stmt ( @{$self->{stmts}} ) {
$stmt->eval($env1)
}
}
}
;
{
package Lit::Array;
sub new { shift; bless { @_ }, "Lit::Array" }
sub array1 { $_[0]->{array1} };
sub eval {
my $self = $_[0];
my $env = $_[1];
(my $List_a = bless [], 'ARRAY');
for my $v ( @{$self->{array1}} ) {
push( @{$List_a}, $v->eval($env) )
};
return scalar ($List_a)
}
}
;
{
package Lit::Hash;
sub new { shift; bless { @_ }, "Lit::Hash" }
sub hash1 { $_[0]->{hash1} };
sub eval {
my $self = $_[0];
my $env = $_[1];
(my $Hash_h = bless {}, 'HASH');
for my $field ( @{$self->{hash1}} ) {
((my $pair) = $field->arguments());
($Hash_h->{($pair->[0])->eval($env)} = ($pair->[1])->eval($env))
};
return scalar ($Hash_h)
}
}
;
{
package Index;
sub new { shift; bless { @_ }, "Index" }
sub obj { $_[0]->{obj} };
sub index_exp { $_[0]->{index_exp} };
sub eval {
my $self = $_[0];
my $env = $_[1];
($self->{obj}->eval($env))->[$self->{index_exp}->eval($env)]
}
}
;
{
package Lookup;
sub new { shift; bless { @_ }, "Lookup" }
sub obj { $_[0]->{obj} };
sub index_exp { $_[0]->{index_exp} };
sub eval {
my $self = $_[0];
my $env = $_[1];
($self->{obj}->eval($env))->{$self->{index_exp}->eval($env)}
}
}
;
{
package Var;
sub new { shift; bless { @_ }, "Var" }
sub sigil { $_[0]->{sigil} };
sub twigil { $_[0]->{twigil} };
sub namespace { $_[0]->{namespace} };
sub name { $_[0]->{name} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $ns) = '');
if ($self->{namespace}) {
($ns = ($self->{namespace} . '::'))
}
else {
if ((((($self->{sigil} eq chr(64))) && (($self->{twigil} eq '*'))) && (($self->{name} eq 'ARGS')))) {
return scalar ((\@ARGV))
};
if (($self->{twigil} eq '.')) {
warn(('Interpreter TODO: ' . chr(36) . '.' . $self->{name}));
return scalar ((chr(36) . 'self->' . chr(123) . $self->{name} . chr(125)))
};
if (($self->{name} eq chr(47))) {
warn('Interpreter TODO: ' . chr(36) . chr(47));
return scalar (($self->{sigil} . 'MATCH'))
}
};
((my $name) = ($self->{sigil} . $ns . $self->{name}));
for my $e ( @{(($env))} ) {
if (exists($e->{$name})) {
return scalar ($e->{$name})
}
};
warn(('Interpreter runtime error: variable ' . chr(39)), $name, (chr(39) . ' not found'))
};
sub plain_name {
my $self = $_[0];
if ($self->{namespace}) {
return scalar (($self->{sigil} . $self->{namespace} . '::' . $self->{name}))
};
return scalar (($self->{sigil} . $self->{name}))
}
}
;
{
package Proto;
sub new { shift; bless { @_ }, "Proto" }
sub name { $_[0]->{name} };
sub eval {
my $self = $_[0];
my $env = $_[1];
"".($self->{name})
}
}
;
{
package Call;
sub new { shift; bless { @_ }, "Call" }
sub invocant { $_[0]->{invocant} };
sub hyper { $_[0]->{hyper} };
sub method { $_[0]->{method} };
sub arguments { $_[0]->{arguments} };
sub eval {
my $self = $_[0];
my $env = $_[1];
warn(('Interpreter TODO: Call'));
((my $invocant) = $self->{invocant}->eval($env));
if (($invocant eq 'self')) {
($invocant = chr(36) . 'self')
};
if (($self->{hyper})) {
};
warn(('Interpreter runtime error: method ' . chr(39)), $self->{method}, ('()' . chr(39) . ' not found'))
}
}
;
{
package Apply;
sub new { shift; bless { @_ }, "Apply" }
sub code { $_[0]->{code} };
sub arguments { $_[0]->{arguments} };
sub namespace { $_[0]->{namespace} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $ns) = '');
if ($self->{namespace}) {
($ns = ($self->{namespace} . '::'))
};
((my $code) = ($ns . $self->{code}));
for my $e ( @{(($env))} ) {
if (exists($e->{$code})) {
return scalar ((($e->{$code})->($env, $self->{arguments})))
}
};
warn(('Interpreter runtime error: subroutine ' . chr(39)), $code, ('()' . chr(39) . ' not found'))
}
}
;
{
package If;
sub new { shift; bless { @_ }, "If" }
sub cond { $_[0]->{cond} };
sub body { $_[0]->{body} };
sub otherwise { $_[0]->{otherwise} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $cond) = $self->{cond});
if ($cond->eval($env)) {
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $stmt ( @{((($self->{body})->stmts()))} ) {
$stmt->eval($env1)
}
}
else {
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $stmt ( @{((($self->{otherwise})->stmts()))} ) {
$stmt->eval($env1)
}
};
return scalar (undef())
}
}
;
{
package For;
sub new { shift; bless { @_ }, "For" }
sub cond { $_[0]->{cond} };
sub body { $_[0]->{body} };
sub topic { $_[0]->{topic} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $cond) = $self->{cond});
((my $topic_name) = (($self->{body})->sig())->plain_name());
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $topic ( @{(($cond->eval($env)))} ) {
($env1->[0] = do {
(my $Hash_a = bless {}, 'HASH');
($Hash_a->{$topic_name} = $topic);
$Hash_a
});
for my $stmt ( @{((($self->{body})->stmts()))} ) {
$stmt->eval($env1)
}
};
return scalar (undef())
}
}
;
{
package When;
sub new { shift; bless { @_ }, "When" }
sub parameters { $_[0]->{parameters} };
sub body { $_[0]->{body} };
sub eval {
my $self = $_[0];
my $env = $_[1];
die(('TODO - When'))
}
}
;
{
package While;
sub new { shift; bless { @_ }, "While" }
sub init { $_[0]->{init} };
sub cond { $_[0]->{cond} };
sub continue { $_[0]->{continue} };
sub body { $_[0]->{body} };
sub eval {
my $self = $_[0];
my $env = $_[1];
die(('TODO - While'))
}
}
;
{
package Decl;
sub new { shift; bless { @_ }, "Decl" }
sub decl { $_[0]->{decl} };
sub type { $_[0]->{type} };
sub var { $_[0]->{var} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $decl) = $self->{decl});
((my $name) = $self->{var}->plain_name());
if (($decl eq 'has')) {
warn(('Interpreter TODO: has'))
};
if (!((exists(($env->[0])->{$name})))) {
(($env->[0])->{$name} = undef())
};
return scalar (undef())
};
sub plain_name {
my $self = $_[0];
$self->{var}->plain_name()
}
}
;
{
package Sig;
sub new { shift; bless { @_ }, "Sig" }
sub invocant { $_[0]->{invocant} };
sub positional { $_[0]->{positional} };
sub named { $_[0]->{named} };
sub eval {
my $self = $_[0];
my $env = $_[1];
warn(('Interpreter TODO: Sig'))
}
}
;
{
package Method;
sub new { shift; bless { @_ }, "Method" }
sub name { $_[0]->{name} };
sub sig { $_[0]->{sig} };
sub block { $_[0]->{block} };
sub eval {
my $self = $_[0];
my $env = $_[1];
warn(('Interpreter TODO: Method'));
((my $sig) = $self->{sig});
((my $invocant) = $sig->invocant());
((my $pos) = $sig->positional());
((my $str) = 'my ' . chr(36) . 'List__ ' . chr(61) . ' ' . chr(92) . chr(64) . '_' . chr(59) . ' ')
}
}
;
{
package Sub;
sub new { shift; bless { @_ }, "Sub" }
sub name { $_[0]->{name} };
sub sig { $_[0]->{sig} };
sub block { $_[0]->{block} };
sub eval {
my $self = $_[0];
my $env = $_[1];
(my $List_param_name = bless [], 'ARRAY');
for my $field ( @{(($self->{sig}->positional()))} ) {
push( @{$List_param_name}, $field->plain_name() )
};
((my $sub) = sub {
my $env = $_[0];
my $args = $_[1];
(my $Hash_context = bless {}, 'HASH');
((my $n) = 0);
($Hash_context->{chr(64) . '_'} = $args);
for my $name ( @{$List_param_name} ) {
($Hash_context->{$name} = ($args->[$n])->eval($env));
($n = ($n + 1))
};
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, $Hash_context );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
(my $r);
for my $stmt ( @{$self->{block}} ) {
($r = $stmt->eval($env1))
};
return scalar ($r)
});
if ($self->{name}) {
(($env->[0])->{$self->{name}} = $sub)
};
return scalar ($sub)
}
}
;
{
package Do;
sub new { shift; bless { @_ }, "Do" }
sub block { $_[0]->{block} };
sub eval {
my $self = $_[0];
my $env = $_[1];
((my $env1) = do {
(my $List_a = bless [], 'ARRAY');
(my $List_v = bless [], 'ARRAY');
push( @{$List_a}, do {
(my $Hash_a = bless {}, 'HASH');
$Hash_a
} );
($List_v = ($env));
for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
push( @{$List_a}, $List_v->[$x] )
};
$List_a
});
for my $stmt ( @{$self->{block}} ) {
$stmt->eval($env1)
}
}
}
;
{
package Use;
sub new { shift; bless { @_ }, "Use" }
sub mod { $_[0]->{mod} };
sub eval {
my $self = $_[0];
my $env = $_[1];
warn(('Interpreter TODO: Use'));
('use ' . $self->{mod})
}
}
}
1;