# Do not edit this file - Generated by Perlito6 9.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito6::Perl5::Runtime;
use Perlito6::Perl5::Prelude;
our $MATCH = Perlito6::Match->new();
{
package GLOBAL;
    sub new { shift; bless { @_ }, "GLOBAL" }

    # use v6 
;
    {
    package Perlito6::Go::LexicalBlock;
        sub new { shift; bless { @_ }, "Perlito6::Go::LexicalBlock" }
        sub block { $_[0]->{block} };
        sub needs_return { $_[0]->{needs_return} };
        sub top_level { $_[0]->{top_level} };
        sub emit_go {
            my $self = $_[0];
            if (!(((defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))))) {
                return scalar ('')
            };
            ((my  $str) = '');
            (my  $Hash_decl_seen = bless {}, 'HASH');
            for my $decl1 ( @{(defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))} ) {
                ((my  $decl) = $decl1);
                if (((Main::isa($decl, 'Bind') && Main::isa(($decl->parameters()), 'Decl')) && ((($decl->parameters())->decl() eq 'my')))) {
                    ($decl = $decl->parameters())
                };
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'my')))) {
                    ((my  $var_name) = (($decl)->var())->emit_go());
                    if (!(($Hash_decl_seen->{$var_name}))) {
                        ($str = ($str . $decl->emit_go_init()));
                        ($Hash_decl_seen->{$var_name} = 1)
                    }
                }
            };
            (my  $last_statement);
            if ($self->{needs_return}) {
                ($last_statement = pop( @{(defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))} ))
            };
            for my $decl ( @{(defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))} ) {
                if ((!(((Main::isa($decl, 'Decl') && (($decl->decl() eq 'my'))))))) {
                    ($str = ($str . ($decl)->emit_go() . chr(59)))
                }
            };
            if (($self->{needs_return} && $last_statement)) {
                if (Main::isa($last_statement, 'If')) {
                    ((my  $cond) = $last_statement->cond());
                    ((my  $body) = $last_statement->body());
                    ((my  $otherwise) = $last_statement->otherwise());
                    if ((Main::isa($cond, 'Apply') && ($cond->code() eq 'prefix:<' . chr(33) . '>'))) {
                        ($cond = ($cond->arguments())->[0]);
                        ($body = $last_statement->otherwise());
                        ($otherwise = $last_statement->body())
                    };
                    if ((Main::isa($cond, 'Var') && ($cond->sigil() eq chr(64)))) {
                        ($cond = Apply->new(('code' => 'prefix:<' . chr(64) . '>'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $cond );
    $List_a
})))
                    };
                    ($body = Perlito6::Go::LexicalBlock->new(('block' => $body), ('needs_return' => 1), ('top_level' => $self->{top_level})));
                    ($otherwise = Perlito6::Go::LexicalBlock->new(('block' => $otherwise), ('needs_return' => 1), ('top_level' => $self->{top_level})));
                    ($str = ($str . 'if tobool( ' . Call::emit_go_call($cond, 'Bool') . ' ) ' . chr(123) . ' ' . $body->emit_go() . ' ' . chr(125) . ' else ' . chr(123) . ' ' . $otherwise->emit_go() . ' ' . chr(125)))
                }
                else {
                    if ((Main::isa($last_statement, 'Return') || Main::isa($last_statement, 'For'))) {
                        ($str = ($str . $last_statement->emit_go()))
                    }
                    else {
                        ($last_statement = Return->new(('result' => $last_statement)));
                        if ($self->{top_level}) {
                            ($str = ($str . $last_statement->emit_go()))
                        }
                        else {
                            ($str = ($str . $last_statement->emit_go_simple()))
                        }
                    }
                }
            };
            return scalar ($str)
        }
    }

;
    {
    package CompUnit;
        sub new { shift; bless { @_ }, "CompUnit" }
        sub attributes { $_[0]->{attributes} };
        sub methods { $_[0]->{methods} };
        sub emit_go {
            my $self = $_[0];
            ((my  $class_name) = Main::to_go_namespace($self->{name}));
            ((my  $str) = (chr(47) . chr(47) . ' instances of class ' . $self->{name} . (chr(10)) . 'type ' . $class_name . ' struct ' . chr(123) . (chr(10))));
            for my $decl ( @{((Main::values(((defined $self->{attributes} ? $self->{attributes} : ($self->{attributes} = bless({}, 'HASH')))), )))} ) {
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'has')))) {
                    ($str = ($str . '  ' . 'v_' . ($decl->var())->name() . ' *Any' . chr(59) . (chr(10))))
                }
            };
            ($str = ($str . chr(125) . (chr(10))));
            ($str = ($str . chr(47) . chr(47) . ' methods in class ' . $self->{name} . (chr(10)) . 'var Method_' . $class_name . ' struct ' . chr(123) . (chr(10))));
            for my $decl ( @{((Main::values(((defined $self->{methods} ? $self->{methods} : ($self->{methods} = bless({}, 'HASH')))), )))} ) {
                if (Main::isa($decl, 'Method')) {
                    ($str = ($str . '  ' . 'f_' . $decl->name() . ' func (*' . $class_name . ', Capture) *Any' . chr(59) . (chr(10))))
                }
            };
            for my $decl ( @{((Main::values(((defined $self->{attributes} ? $self->{attributes} : ($self->{attributes} = bless({}, 'HASH')))), )))} ) {
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'has')))) {
                    ($str = ($str . '  ' . 'f_' . ($decl->var())->name() . ' func (*' . $class_name . ', Capture) *Any' . chr(59) . (chr(10))))
                }
            };
            ($str = ($str . chr(125) . (chr(10))));
            ($str = ($str . chr(47) . chr(47) . ' namespace ' . $self->{name} . (chr(10)) . 'var Namespace_' . $class_name . ' struct ' . chr(123) . (chr(10))));
            for my $decl ( @{(defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))} ) {
                if (Main::isa($decl, 'Sub')) {
                    ($str = ($str . '  ' . 'f_' . $decl->name() . ' Function' . chr(59) . (chr(10))))
                }
            };
            ($str = ($str . chr(125) . (chr(10))));
            ($str = ($str . 'var Run_' . $class_name . ' func ()' . chr(59) . (chr(10))));
            ($str = ($str . chr(47) . chr(47) . ' method wrappers for ' . $self->{name} . (chr(10))));
            for my $decl ( @{((Main::values(((defined $self->{methods} ? $self->{methods} : ($self->{methods} = bless({}, 'HASH')))), )))} ) {
                if (Main::isa($decl, 'Method')) {
                    ($str = ($str . 'func (v_self *' . $class_name . ') f_' . $decl->name() . ' (v Capture) *Any ' . chr(123) . (chr(10)) . '  return Method_' . $class_name . '.f_' . $decl->name() . '(v_self, v)' . chr(59) . (chr(10)) . chr(125) . (chr(10))))
                }
            };
            for my $decl ( @{((Main::values(((defined $self->{attributes} ? $self->{attributes} : ($self->{attributes} = bless({}, 'HASH')))), )))} ) {
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'has')))) {
                    ($str = ($str . 'func (v_self *' . $class_name . ') f_' . ($decl->var())->name() . ' (v Capture) *Any ' . chr(123) . (chr(10)) . '  return Method_' . $class_name . '.f_' . ($decl->var())->name() . '(v_self, v)' . chr(59) . (chr(10)) . chr(125) . (chr(10))))
                }
            };
            if (!((((defined $self->{methods} ? $self->{methods} : ($self->{methods} = bless({}, 'HASH'))))->{'isa'}))) {
                ($str = ($str . 'func (v_self *' . $class_name . ') f_isa (v Capture) *Any ' . chr(123) . ' ' . 'return toBool( ' . chr(34) . $self->{name} . chr(34) . ' ' . chr(61) . chr(61) . ' tostr( v.p[0] ) ) ' . chr(125) . (chr(10))))
            };
            if (!((((defined $self->{methods} ? $self->{methods} : ($self->{methods} = bless({}, 'HASH'))))->{'perl'}))) {
                ($str = ($str . 'func (v_self *' . $class_name . ') f_perl (v Capture) *Any ' . chr(123) . ' ' . 'return toStr( ' . chr(34) . '::' . $self->{name} . '(' . chr(34) . ' '));
                ((my  $sep) = '');
                for my $decl ( @{((Main::values(((defined $self->{attributes} ? $self->{attributes} : ($self->{attributes} = bless({}, 'HASH')))), )))} ) {
                    if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'has')))) {
                        ($str = ($str . $sep . '+ ' . chr(34) . ($decl->var())->name() . ' ' . chr(61) . '> ' . chr(34) . '+ tostr((*(*v_self).f_' . ($decl->var())->name() . '(Capture' . chr(123) . chr(125) . ')).(perl_er).f_perl(Capture' . chr(123) . chr(125) . ')) '));
                        ($sep = '+ ' . chr(34) . ', ' . chr(34) . ' ')
                    }
                };
                ($str = ($str . '+ ' . chr(34) . ')' . chr(34) . ' ) ' . chr(125) . (chr(10))))
            };
            if (((!((((defined $self->{methods} ? $self->{methods} : ($self->{methods} = bless({}, 'HASH'))))->{'Bool'}))) && (!((((defined $self->{attributes} ? $self->{attributes} : ($self->{attributes} = bless({}, 'HASH'))))->{'Bool'}))))) {
                ($str = ($str . 'func (v_self *' . $class_name . ') f_Bool (v Capture) *Any ' . chr(123) . ' ' . 'return b_true() ' . chr(125) . (chr(10))))
            };
            ($str = ($str . chr(47) . chr(47) . ' prototype of ' . $self->{name} . (chr(10)) . 'var Proto_' . $class_name . ' *Any' . chr(59) . (chr(10))));
            ($str = ($str . 'func Init_' . $class_name . '() ' . chr(123) . (chr(10))));
            ($str = ($str . '  this_namespace :' . chr(61) . ' ' . chr(38) . 'Namespace_' . $class_name . chr(59) . (chr(10)) . '  this_namespace ' . chr(61) . ' this_namespace' . chr(59) . (chr(10))));
            ($str = ($str . '  Proto_' . $class_name . ' ' . chr(61) . ' ' . 'func() *Any ' . chr(123) . ' ' . 'var m ' . chr(61) . ' new(' . $class_name . ')' . chr(59) . ' ' . 'var m1 Any ' . chr(61) . ' m' . chr(59) . ' ' . 'return ' . chr(38) . 'm1' . chr(59) . ' ' . chr(125) . '()' . chr(59) . (chr(10))));
            (my  $Hash_decl_seen = bless {}, 'HASH');
            for my $decl1 ( @{(defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))} ) {
                ((my  $decl) = $decl1);
                if (((Main::isa($decl, 'Bind') && Main::isa(($decl->parameters()), 'Decl')) && ((($decl->parameters())->decl() eq 'my')))) {
                    ($decl = $decl->parameters())
                };
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'my')))) {
                    ((my  $var_name) = (($decl)->var())->emit_go());
                    if (!(($Hash_decl_seen->{$var_name}))) {
                        ($str = ($str . $decl->emit_go_init()));
                        ($Hash_decl_seen->{$var_name} = 1)
                    }
                }
            };
            for my $decl ( @{(defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))} ) {
                if ((Main::isa($decl, 'Decl') && (($decl->decl() eq 'has')))) {
                    ($str = ($str . '  ' . chr(47) . chr(47) . ' accessor ' . ($decl->var())->name() . (chr(10)) . '  Method_' . $class_name . '.f_' . ($decl->var())->name() . ' ' . chr(61) . ' func (v_self *' . $class_name . ', v Capture) *Any ' . chr(123) . (chr(10))));
                    ($str = ($str . '    ' . 'if v_self.v_' . ($decl->var())->name() . ' ' . chr(61) . chr(61) . ' nil ' . chr(123) . (chr(10)) . '      ' . (Decl->new(('decl' => 'my'), ('type' => undef()), ('var' => Var->new(('sigil' => ($decl->var())->sigil()), ('twigil' => ''), ('namespace' => ''), ('name' => 'tmp')))))->emit_go_init() . '      ' . 'v_self.v_' . ($decl->var())->name() . ' ' . chr(61) . ' ' . (Var->new(('sigil' => ($decl->var())->sigil()), ('twigil' => ''), ('namespace' => ''), ('name' => 'tmp')))->emit_go() . chr(59) . (chr(10)) . '    ' . chr(125) . (chr(10))));
                    ($str = ($str . '    ' . 'if *v_self.v_' . ($decl->var())->name() . ' ' . chr(61) . chr(61) . ' nil ' . chr(123) . (chr(10)) . '      ' . (Decl->new(('decl' => 'my'), ('type' => undef()), ('var' => Var->new(('sigil' => ($decl->var())->sigil()), ('twigil' => ''), ('namespace' => ''), ('name' => 'tmp')))))->emit_go_init() . '      ' . 'v_self.v_' . ($decl->var())->name() . ' ' . chr(61) . ' ' . (Var->new(('sigil' => ($decl->var())->sigil()), ('twigil' => ''), ('namespace' => ''), ('name' => 'tmp')))->emit_go() . chr(59) . (chr(10)) . '    ' . chr(125) . (chr(10))));
                    ($str = ($str . '    ' . 'return v_self.v_' . ($decl->var())->name() . (chr(10)) . '  ' . chr(125) . chr(59) . (chr(10))))
                };
                if (Main::isa($decl, 'Method')) {
                    ((my  $sig) = $decl->sig());
                    ((my  $block) = Perlito6::Go::LexicalBlock->new(('block' => $decl->block()), ('needs_return' => 1), ('top_level' => 1)));
                    ($str = ($str . '  ' . chr(47) . chr(47) . ' method ' . $decl->name() . (chr(10)) . '  Method_' . $class_name . '.f_' . $decl->name() . ' ' . chr(61) . ' func (self *' . $class_name . ', v Capture) *Any ' . chr(123) . (chr(10))));
                    ($str = ($str . '    var self1 Any ' . chr(61) . ' self' . chr(59) . (chr(10)) . '    var ' . ($sig->invocant())->emit_go() . ' *Any ' . chr(61) . ' ' . chr(38) . 'self1' . chr(59) . (chr(10)) . '    ' . ($sig->invocant())->emit_go() . ' ' . chr(61) . ' ' . ($sig->invocant())->emit_go() . chr(59) . (chr(10)) . '    ' . $sig->emit_go_bind() . (chr(10))));
                    ($str = ($str . '    p :' . chr(61) . ' make(chan *Any)' . chr(59) . ' go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . $block->emit_go() . chr(59) . ' p <- nil ' . chr(125) . '()' . chr(59) . ' ' . (chr(10)) . '    return <-p' . chr(59) . ' ' . (chr(10)) . '  ' . chr(125) . chr(59) . (chr(10))))
                };
                if (Main::isa($decl, 'Sub')) {
                    ((my  $sig) = $decl->sig());
                    ((my  $block) = Perlito6::Go::LexicalBlock->new(('block' => $decl->block()), ('needs_return' => 1), ('top_level' => 1)));
                    ($str = ($str . '  ' . chr(47) . chr(47) . ' sub ' . $decl->name() . (chr(10)) . '  Namespace_' . $class_name . '.f_' . $decl->name() . ' ' . chr(61) . ' Function( func (v Capture) *Any ' . chr(123) . (chr(10))));
                    ($str = ($str . '    ' . $sig->emit_go_bind() . (chr(10)) . '    p :' . chr(61) . ' make(chan *Any)' . chr(59) . ' go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . $block->emit_go() . chr(59) . ' p <- nil ' . chr(125) . '()' . chr(59) . ' ' . (chr(10))));
                    ($str = ($str . '    return <-p' . chr(59) . ' ' . (chr(10)) . '  ' . chr(125) . ' )' . chr(59) . (chr(10))))
                }
            };
            ($str = ($str . '  ' . chr(47) . chr(47) . ' main runtime block of ' . $self->{name} . (chr(10)) . '  Run_' . $class_name . ' ' . chr(61) . ' func () ' . chr(123) . (chr(10))));
            for my $decl ( @{(defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))} ) {
                if ((((!(((Main::isa($decl, 'Decl') && (((($decl->decl() eq 'has')) || (($decl->decl() eq 'my')))))))) && (!((Main::isa($decl, 'Method'))))) && (!((Main::isa($decl, 'Sub')))))) {
                    ($str = ($str . '    ' . ($decl)->emit_go() . chr(59) . (chr(10))))
                }
            };
            ($str = ($str . '  ' . chr(125) . (chr(10))));
            ($str = ($str . chr(125) . (chr(10))));
            return scalar ($str)
        };
        sub emit_go_program {
            my $comp_units = $_[0];
            ((my  $str) = '');
            (my  $Hash_unit_seen = bless {}, 'HASH');
            (my  $List_tmp_comp_unit = bless [], 'ARRAY');
            for my $comp_unit ( @{(($comp_units))} ) {
                ((my  $name) = $comp_unit->name());
                if ($Hash_unit_seen->{$name}) {
                    for my $stmt ( @{(($comp_unit->body()))} ) {
                        push( @{($Hash_unit_seen->{$name})->body()}, $stmt )
                    }
                }
                else {
                    ($Hash_unit_seen->{$name} = $comp_unit);
                    push( @{$List_tmp_comp_unit}, $comp_unit )
                }
            };
            ($comp_units = $List_tmp_comp_unit);
            for my $comp_unit ( @{(($comp_units))} ) {
                for my $stmt ( @{(($comp_unit->body()))} ) {
                    if (Main::isa($stmt, 'Method')) {
                        (($comp_unit->methods())->{$stmt->name()} = $stmt)
                    };
                    if ((Main::isa($stmt, 'Decl') && (($stmt->decl() eq 'has')))) {
                        (($comp_unit->attributes())->{($stmt->var())->name()} = $stmt)
                    }
                }
            };
            for my $comp_unit ( @{(($comp_units))} ) {
                ($str = ($str . $comp_unit->emit_go()))
            };
            if (!(($Hash_unit_seen->{('Perlito6::Grammar')}))) {
                ($str = ($str . ('type Perlito__Grammar struct' . chr(123) . chr(125) . chr(10))))
            };
            ($str = ($str . (chr(47) . chr(47) . ' interfaces for all methods' . chr(10))));
            ((my  $Hash_meth_seen = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'join'} = 1);
    ($Hash_a->{'perl'} = 1);
    ($Hash_a->{'scalar'} = 1);
    ($Hash_a->{'isa'} = 1);
    ($Hash_a->{'values'} = 1);
    ($Hash_a->{'keys'} = 1);
    ($Hash_a->{'exists'} = 1);
    ($Hash_a->{'bind'} = 1);
    ($Hash_a->{'int'} = 1);
    ($Hash_a->{'num'} = 1);
    ($Hash_a->{'str'} = 1);
    ($Hash_a->{'Str'} = 1);
    ($Hash_a->{'bool'} = 1);
    ($Hash_a->{'Bool'} = 1);
    ($Hash_a->{'array'} = 1);
    ($Hash_a->{'hash'} = 1);
    ($Hash_a->{'push'} = 1);
    ($Hash_a->{'pop'} = 1);
    ($Hash_a->{'shift'} = 1);
    ($Hash_a->{'lookup'} = 1);
    ($Hash_a->{'index'} = 1);
    ($Hash_a->{'function'} = 1);
    $Hash_a
});
            for my $comp_unit ( @{(($comp_units))} ) {
                for my $stmt ( @{(($comp_unit->body()))} ) {
                    if ((Main::isa($stmt, 'Method') && !(($Hash_meth_seen->{$stmt->name()})))) {
                        ((my  $meth) = $stmt->name());
                        ($str = ($str . ('type ') . $meth . ('_er interface ' . chr(123) . ' f_') . $meth . (' (Capture) *Any ' . chr(125) . chr(10))));
                        ($Hash_meth_seen->{$meth} = 1)
                    };
                    if (((Main::isa($stmt, 'Decl') && (($stmt->decl() eq 'has'))) && !(($Hash_meth_seen->{($stmt->var())->name()})))) {
                        ((my  $meth) = ($stmt->var())->name());
                        ($str = ($str . ('type ') . $meth . ('_er interface ' . chr(123) . ' f_') . $meth . (' (Capture) *Any ' . chr(125) . chr(10))));
                        ($Hash_meth_seen->{$meth} = 1)
                    }
                }
            };
            ($str = ($str . (chr(10)) . ('func main () ' . chr(123) . chr(10)) . ('  Init_Perlito__Match()' . chr(59) . chr(10))));
            for my $comp_unit ( @{(($comp_units))} ) {
                ($str = ($str . ('  Init_') . Main::to_go_namespace($comp_unit->name()) . ('()' . chr(59) . chr(10))))
            };
            ($str = ($str . ('  Init_Prelude()' . chr(59) . chr(10))));
            for my $comp_unit ( @{(($comp_units))} ) {
                ($str = ($str . ('  Run_') . Main::to_go_namespace($comp_unit->name()) . ('()' . chr(59) . chr(10))))
            };
            ($str = ($str . chr(125) . (chr(10))));
            return scalar ($str)
        }
    }

;
    {
    package Val::Int;
        sub new { shift; bless { @_ }, "Val::Int" }
        sub emit_go {
            my $self = $_[0];
            ('toInt(' . $self->{int} . ')')
        }
    }

;
    {
    package Val::Bit;
        sub new { shift; bless { @_ }, "Val::Bit" }
        sub emit_go {
            my $self = $_[0];
            ($self->{bit} ? 'b_true()' : 'b_false()')
        }
    }

;
    {
    package Val::Num;
        sub new { shift; bless { @_ }, "Val::Num" }
        sub emit_go {
            my $self = $_[0];
            ('toNum(' . $self->{num} . ')')
        }
    }

;
    {
    package Val::Buf;
        sub new { shift; bless { @_ }, "Val::Buf" }
        sub emit_go {
            my $self = $_[0];
            ('toStr(' . chr(34) . $self->{buf} . chr(34) . ')')
        }
    }

;
    {
    package Lit::Array;
        sub new { shift; bless { @_ }, "Lit::Array" }
        sub emit_go {
            my $self = $_[0];
            ((my  $ast) = $self->expand_interpolation());
            return scalar ($ast->emit_go())
        }
    }

;
    {
    package Lit::Hash;
        sub new { shift; bless { @_ }, "Lit::Hash" }
        sub emit_go {
            my $self = $_[0];
            ((my  $ast) = $self->expand_interpolation());
            return scalar ($ast->emit_go())
        }
    }

;
    {
    package Index;
        sub new { shift; bless { @_ }, "Index" }
        sub emit_go {
            my $self = $_[0];
            ('(*(*' . $self->{obj}->emit_go() . ').(array_er).f_array(Capture' . chr(123) . chr(125) . '))' . '.(index_er).f_index( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . $self->{index_exp}->emit_go() . ' ' . chr(125) . chr(125) . ' )')
        }
    }

;
    {
    package Lookup;
        sub new { shift; bless { @_ }, "Lookup" }
        sub emit_go {
            my $self = $_[0];
            ('(*(*' . $self->{obj}->emit_go() . ').(hash_er).f_hash(Capture' . chr(123) . chr(125) . '))' . '.(lookup_er).f_lookup( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . $self->{index_exp}->emit_go() . ' ' . chr(125) . chr(125) . ' )')
        }
    }

;
    {
    package Var;
        sub new { shift; bless { @_ }, "Var" }
        sub emit_go {
            my $self = $_[0];
            ((my  $table) = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{chr(36)} = 'v_');
    ($Hash_a->{chr(64)} = 'List_');
    ($Hash_a->{chr(37)} = 'Hash_');
    ($Hash_a->{chr(38)} = 'Code_');
    $Hash_a
});
            ((my  $ns) = '');
            if ($self->{namespace}) {
                ($ns = (Main::to_go_namespace($self->{namespace}) . '.'))
            };
            ((($self->{twigil} eq '.')) ? (('(*v_self).(' . $self->{name} . '_er).f_' . $self->{name} . '(Capture' . chr(123) . chr(125) . ')')) : (((($self->{name} eq chr(47))) ? ('v_MATCH') : (($table->{$self->{sigil}} . $ns . $self->{name})))))
        };
        sub plain_name {
            my $self = $_[0];
            if ($self->{namespace}) {
                return scalar (($self->{namespace} . '.' . $self->{name}))
            };
            return scalar ($self->{name})
        }
    }

;
    {
    package Bind;
        sub new { shift; bless { @_ }, "Bind" }
        sub parameters { $_[0]->{parameters} };
        sub arguments { $_[0]->{arguments} };
        sub emit_go {
            my $self = $_[0];
            if (Main::isa($self->{parameters}, 'Call')) {
                return scalar (('func () *Any ' . chr(123) . ' ' . 'var tmp ' . chr(61) . ' ' . Call::emit_go_call($self->{parameters}->invocant(), $self->{parameters}->method()) . chr(59) . ' ' . '*tmp ' . chr(61) . ' *( ' . $self->{arguments}->emit_go() . ' )' . chr(59) . ' ' . 'return tmp' . chr(59) . ' ' . chr(125) . '()'))
            };
            ('*' . $self->{parameters}->emit_go() . ' ' . chr(61) . ' *(' . $self->{arguments}->emit_go() . ')')
        }
    }

;
    {
    package Proto;
        sub new { shift; bless { @_ }, "Proto" }
        sub emit_go {
            my $self = $_[0];
            Main::to_go_namespace($self->{name})
        }
    }

;
    {
    package Call;
        sub new { shift; bless { @_ }, "Call" }
        sub emit_go {
            my $self = $_[0];
            ((my  $invocant) = $self->{invocant}->emit_go());
            if (Main::isa(($self->{invocant}), 'Proto')) {
                if (($self->{invocant}->name() eq 'self')) {
                    ($invocant = 'v_self')
                }
                else {
                    ($invocant = ('Proto_' . $invocant))
                }
            };
            ((my  $meth) = $self->{method});
            if (($meth eq 'postcircumfix:<( )>')) {
                if (($self->{hyper})) {
                    ($meth = '')
                }
                else {
                    return scalar (('((*' . $invocant . ').(function_er).f_function( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' ))'))
                }
            };
            if (($self->{hyper})) {
                return scalar (('func (a_ *Any) *Any ' . chr(123) . ' ' . (chr(10)) . '  var out ' . chr(61) . ' a_array()' . chr(59) . ' ' . (chr(10)) . '  var i ' . chr(61) . ' (*(*a_).(array_er).f_array(Capture' . chr(123) . chr(125) . ')).(*Array)' . chr(59) . ' ' . (chr(10)) . '  for pos :' . chr(61) . ' 0' . chr(59) . ' pos <' . chr(61) . ' i.n' . chr(59) . ' pos++ ' . chr(123) . ' ' . (chr(10)) . '    (*out).(push_er).f_push( Capture' . chr(123) . 'p: []*Any' . chr(123) . ' (*i.v[pos]).(' . $meth . '_er).f_' . $meth . '(Capture' . chr(123) . ' p : []*Any' . chr(123) . chr(125) . '  ' . chr(125) . ') ' . chr(125) . chr(125) . ' )' . (chr(10)) . '  ' . chr(125) . ' ' . (chr(10)) . '  return out' . chr(59) . ' ' . (chr(10)) . chr(125) . '(' . $invocant . ')'))
            };
            return scalar (('(*' . $invocant . ').(' . $meth . '_er).f_' . $meth . '( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
        };
        sub emit_go_call {
            my $invocant = $_[0];
            my $meth_name = $_[1];
            ((my  $invocant1) = $invocant->emit_go());
            if (Main::isa(($invocant), 'Proto')) {
                ($invocant1 = ('Proto_' . $invocant1))
            };
            ((my  $meth) = $meth_name);
            return scalar (('(*' . $invocant1 . ').(' . $meth . '_er).f_' . $meth . '(Capture' . chr(123) . chr(125) . ')'))
        }
    }

;
    {
    package Apply;
        sub new { shift; bless { @_ }, "Apply" }
        sub emit_go {
            my $self = $_[0];
            ((my  $code) = $self->{code});
            if (Main::isa($code, 'Str')) {

            }
            else {
                return scalar (('(' . $self->{code}->emit_go() . ')->(' . Main::join(([ map { $_->emit() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'self')) {
                return scalar ('v_self')
            };
            if (($code eq 'False')) {
                return scalar ('b_false()')
            };
            if (($code eq 'True')) {
                return scalar ('b_true()')
            };
            if (($code eq 'make')) {
                return scalar (('func () *Any ' . chr(123) . ' ' . 'tmp :' . chr(61) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . chr(59) . ' ' . '*(*v_MATCH).(capture_er).f_capture(Capture' . chr(123) . chr(125) . ') ' . chr(61) . ' *tmp' . chr(59) . ' ' . 'return tmp' . chr(59) . ' ' . chr(125) . '()'))
            };
            if (($code eq 'go')) {
                return scalar (('go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . (Perlito6::Go::LexicalBlock->new(('block' => ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->block()), ('needs_return' => 0), ('top_level' => 1)))->emit_go() . (chr(10)) . '    ' . chr(125) . '()'))
            };
            if (($code eq 'say')) {
                return scalar (('f_print( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ', toStr(' . chr(34) . chr(92) . 'n' . chr(34) . ') ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'print')) {
                return scalar (('f_print( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'warn')) {
                return scalar (('f_print_stderr( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ', toStr(' . chr(34) . chr(92) . 'n' . chr(34) . ') ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'die')) {
                return scalar (('f_die( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'defined')) {
                return scalar (('f_defined( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'pop')) {
                return scalar (('f_pop( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'push')) {
                return scalar (('f_push( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'shift')) {
                return scalar (('f_shift( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'index')) {
                return scalar (('f_index( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'substr')) {
                return scalar (('f_substr( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'scalar')) {
                return scalar (('f_scalar( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'Int')) {
                return scalar (('toInt(' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ')' . ')'))
            };
            if (($code eq 'Num')) {
                return scalar (('toNum(' . 'tonum(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ')' . ')'))
            };
            if (($code eq 'exists')) {
                ((my  $arg) = (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0]);
                if (Main::isa($arg, 'Lookup')) {
                    return scalar (('(*' . ($arg->obj())->emit_go() . ')' . '.(exists_er).f_exists(Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . ($arg->index_exp())->emit_go() . ' ' . chr(125) . ' ' . chr(125) . ' )'))
                }
            };
            if (($code eq 'prefix:<' . chr(126) . '>')) {
                return scalar (Call::emit_go_call((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], 'Str'))
            };
            if (($code eq 'prefix:<' . chr(33) . '>')) {
                return scalar (('toBool(' . chr(33) . 'tobool(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . '))'))
            };
            if (($code eq 'prefix:<' . chr(63) . '>')) {
                return scalar (Call::emit_go_call((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], 'Bool'))
            };
            if (($code eq 'prefix:<' . chr(36) . '>')) {
                return scalar (('f_scalar( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )'))
            };
            if (($code eq 'prefix:<' . chr(64) . '>')) {
                return scalar (Call::emit_go_call((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], 'array'))
            };
            if (($code eq 'prefix:<' . chr(37) . '>')) {
                return scalar (Call::emit_go_call((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], 'hash'))
            };
            if (($code eq 'infix:<' . chr(126) . '>')) {
                return scalar (('toStr( ' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') + ' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ') ' . ')'))
            };
            if (($code eq 'infix:<+>')) {
                return scalar (('f_add( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<->')) {
                return scalar (('f_sub( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<*>')) {
                return scalar (('f_mul( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<' . chr(47) . '>')) {
                return scalar (('f_div( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<>>')) {
                return scalar (('f_greater( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<<>')) {
                return scalar (('f_smaller( ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<>' . chr(61) . '>')) {
                return scalar (('toBool( ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') >' . chr(61) . ' ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ') ' . ')'))
            };
            if (($code eq 'infix:<<' . chr(61) . '>')) {
                return scalar (('toBool( ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') <' . chr(61) . ' ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ') ' . ')'))
            };
            if (($code eq 'infix:<' . chr(38) . chr(38) . '>')) {
                return scalar (('f_and( ' . 'func () *Any ' . chr(123) . ' return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ' ' . chr(125) . ', ' . 'func () *Any ' . chr(123) . ' return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ' ' . chr(125) . ' ' . ')'))
            };
            if (($code eq 'infix:<' . chr(124) . chr(124) . '>')) {
                return scalar (('f_or( ' . 'func () *Any ' . chr(123) . ' return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ' ' . chr(125) . ', ' . 'func () *Any ' . chr(123) . ' return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ' ' . chr(125) . ' ' . ')'))
            };
            if (($code eq 'infix:<eq>')) {
                return scalar (('toBool(' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') ' . chr(61) . chr(61) . ' ' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ')' . ')'))
            };
            if (($code eq 'infix:<ne>')) {
                return scalar (('toBool(' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') ' . chr(33) . chr(61) . ' ' . 'tostr(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ')' . ')'))
            };
            if (($code eq 'infix:<' . chr(61) . chr(61) . '>')) {
                return scalar (('toBool(' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') ' . chr(61) . chr(61) . ' ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ') ' . ')'))
            };
            if (($code eq 'infix:<' . chr(33) . chr(61) . '>')) {
                return scalar (('toBool(' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_go() . ') ' . chr(33) . chr(61) . ' ' . 'toint(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ') ' . ')'))
            };
            if (($code eq 'ternary:<' . chr(63) . chr(63) . ' ' . chr(33) . chr(33) . '>')) {
                return scalar (('func () *Any ' . chr(123) . ' ' . 'if tobool( ' . Call::emit_go_call((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], 'Bool') . ' ) ' . chr(123) . ' return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_go() . ' ' . chr(125) . chr(59) . ' ' . 'return ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[2])->emit_go() . ' ' . chr(125) . '()'))
            };
            ($code = ('f_' . $self->{code}));
            if ($self->{namespace}) {
                ($code = ('Namespace_' . Main::to_go_namespace($self->{namespace}) . '.' . $code))
            }
            else {
                ($code = ('this_namespace.' . $code))
            };
            ($code . '( Capture' . chr(123) . ' p : []*Any' . chr(123) . ' ' . Main::join(([ map { $_->emit_go() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' ' . chr(125) . ' ' . chr(125) . ' )')
        }
    }

;
    {
    package Return;
        sub new { shift; bless { @_ }, "Return" }
        sub emit_go {
            my $self = $_[0];
            if (Main::isa(($self->{result}), 'Bind')) {
                ((my  $tmp) = ($self->{result})->parameters());
                return scalar (('(func () ' . chr(123) . ' ' . ($self->{result})->emit_go() . chr(59) . ' ' . 'p <- ' . $tmp->emit_go() . chr(59) . ' ' . 'runtime.Goexit()' . chr(59) . ' ' . chr(125) . '())'))
            };
            return scalar (('(func () ' . chr(123) . ' ' . 'var tmp *Any ' . chr(61) . ' ' . ($self->{result})->emit_go() . chr(59) . ' ' . 'p <- tmp' . chr(59) . ' ' . 'runtime.Goexit()' . chr(59) . ' ' . chr(125) . '())'))
        };
        sub emit_go_simple {
            my $self = $_[0];
            if (Main::isa(($self->{result}), 'Bind')) {
                ((my  $tmp) = ($self->{result})->parameters());
                return scalar (('return (func () *Any ' . chr(123) . ' ' . ($self->{result})->emit_go() . chr(59) . ' ' . 'return ' . $tmp->emit_go() . chr(59) . ' ' . chr(125) . '())'))
            };
            return scalar (('return( ' . $self->{result}->emit_go() . ')'))
        }
    }

;
    {
    package If;
        sub new { shift; bless { @_ }, "If" }
        sub emit_go {
            my $self = $_[0];
            ((my  $cond) = $self->{cond});
            if ((Main::isa($cond, 'Apply') && ($cond->code() eq 'prefix:<' . chr(33) . '>'))) {
                ((my  $if) = If->new(('cond' => ($cond->arguments())->[0]), ('body' => (defined $self->{otherwise} ? $self->{otherwise} : ($self->{otherwise} ||= bless([], 'ARRAY')))), ('otherwise' => (defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY'))))));
                return scalar ($if->emit_go())
            };
            if ((Main::isa($cond, 'Var') && ($cond->sigil() eq chr(64)))) {
                ($cond = Apply->new(('code' => 'prefix:<' . chr(64) . '>'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $cond );
    $List_a
})))
            };
            ((my  $s) = ('if tobool( ' . Call::emit_go_call($cond, 'Bool') . ' ) ' . chr(123) . ' ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))), ('needs_return' => 0)))->emit_go() . ' ' . chr(125)));
            if (!(((defined $self->{otherwise} ? $self->{otherwise} : ($self->{otherwise} ||= bless([], 'ARRAY')))))) {
                return scalar ($s)
            };
            return scalar (($s . ' else ' . chr(123) . ' ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{otherwise} ? $self->{otherwise} : ($self->{otherwise} ||= bless([], 'ARRAY')))), ('needs_return' => 0)))->emit_go() . ' ' . chr(125)))
        }
    }

;
    {
    package For;
        sub new { shift; bless { @_ }, "For" }
        sub emit_go {
            my $self = $_[0];
            ('func (a_ *Any) ' . chr(123) . ' ' . (chr(10)) . '  var i ' . chr(61) . ' (*(*a_).(array_er).f_array(Capture' . chr(123) . chr(125) . ')).(*Array)' . chr(59) . ' ' . (chr(10)) . '  for pos :' . chr(61) . ' 0' . chr(59) . ' pos <' . chr(61) . ' i.n' . chr(59) . ' pos++ ' . chr(123) . ' ' . (chr(10)) . '    func (' . $self->{topic}->emit_go() . ' *Any) ' . chr(123) . ' ' . (chr(10)) . '      ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))), ('needs_return' => 0)))->emit_go() . (chr(10)) . '    ' . chr(125) . '(i.v[pos]) ' . (chr(10)) . '  ' . chr(125) . ' ' . (chr(10)) . chr(125) . '(' . $self->{cond}->emit_go() . ')')
        }
    }

;
    {
    package When;
        sub new { shift; bless { @_ }, "When" }
        sub emit_go {
            my $self = $_[0];
            die(('TODO - When'))
        }
    }

;
    {
    package While;
        sub new { shift; bless { @_ }, "While" }
        sub emit_go {
            my $self = $_[0];
            ((my  $cond) = $self->{cond});
            if ((Main::isa($cond, 'Var') && ($cond->sigil() eq chr(64)))) {
                ($cond = Apply->new(('code' => 'prefix:<' . chr(64) . '>'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $cond );
    $List_a
})))
            };
            return scalar (('for ' . (($self->{init} ? ($self->{init}->emit_go() . chr(59) . ' ') : chr(59))) . 'tobool( ' . Call::emit_go_call($cond, 'Bool') . ' )' . chr(59) . ' ' . (($self->{continue} ? ($self->{continue}->emit_go() . ' ') : '')) . chr(123) . ' ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))), ('needs_return' => 0)))->emit_go() . ' ' . chr(125)))
        }
    }

;
    {
    package Decl;
        sub new { shift; bless { @_ }, "Decl" }
        sub emit_go {
            my $self = $_[0];
            $self->{var}->emit_go()
        };
        sub emit_go_init {
            my $self = $_[0];
            if (($self->{decl} eq 'my')) {
                ((my  $str) = '');
                ($str = ($str . 'var ' . ($self->{var})->emit_go() . ' *Any' . chr(59) . (chr(10))));
                ($str = ($str . ($self->{var})->emit_go() . ' ' . chr(61) . ' ' . ($self->{var})->emit_go() . chr(59) . (chr(10))));
                if ((($self->{var})->sigil() eq chr(37))) {
                    ($str = ($str . ($self->{var})->emit_go() . ' ' . chr(61) . ' h_hash()' . chr(59) . (chr(10))))
                }
                else {
                    if ((($self->{var})->sigil() eq chr(64))) {
                        ($str = ($str . ($self->{var})->emit_go() . ' ' . chr(61) . ' a_array()' . chr(59) . (chr(10))))
                    }
                    else {
                        ($str = ($str . ($self->{var})->emit_go() . ' ' . chr(61) . ' u_undef()' . chr(59) . (chr(10))))
                    }
                };
                return scalar ($str)
            }
            else {
                die(('not implemented: Decl ' . chr(39) . $self->{decl} . (chr(39))))
            }
        }
    }

;
    {
    package Sig;
        sub new { shift; bless { @_ }, "Sig" }
        sub emit_go {
            my $self = $_[0];
            ''
        };
        sub emit_go_bind {
            my $self = $_[0];
            ((my  $str) = '');
            ((my  $i) = 0);
            for my $decl ( @{(($self->{positional}))} ) {
                ($str = ($str . ('  var ') . $decl->emit_go() . (' *Any' . chr(59) . chr(10)) . ('  if len(v.p) > ') . $i . (' ' . chr(123) . chr(10)) . ('    ') . $decl->emit_go() . (' ' . chr(61) . ' v.p[') . $i . (']' . chr(59) . chr(10)) . ('  ' . chr(125) . chr(10))));
                ($str = ($str . $decl->emit_go() . ' ' . chr(61) . ' ' . $decl->emit_go() . chr(59) . ' '));
                ($i = ($i + 1))
            };
            return scalar ($str)
        }
    }

;
    {
    package Method;
        sub new { shift; bless { @_ }, "Method" }
        sub emit_go {
            my $self = $_[0];
            ((my  $invocant) = ($self->{sig})->invocant());
            ('func ' . $self->{name} . '(v Capture) *Any ' . chr(123) . ' ' . '    ' . ($self->{sig})->emit_go_bind() . (chr(10)) . '    p :' . chr(61) . ' make(chan *Any)' . chr(59) . ' go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))), ('needs_return' => 1), ('top_level' => 1)))->emit_go() . chr(59) . ' p <- nil ' . chr(125) . '()' . chr(59) . ' ' . (chr(10)) . '    return <-p' . chr(59) . ' ' . (chr(10)) . ' ' . chr(125))
        }
    }

;
    {
    package Sub;
        sub new { shift; bless { @_ }, "Sub" }
        sub emit_go {
            my $self = $_[0];
            if (($self->{name} eq '')) {
                return scalar (('toFunction( func(v Capture) *Any ' . chr(123) . ' ' . '    ' . ($self->{sig})->emit_go_bind() . (chr(10)) . '    p :' . chr(61) . ' make(chan *Any)' . chr(59) . ' go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))), ('needs_return' => 1), ('top_level' => 1)))->emit_go() . chr(59) . ' p <- nil ' . chr(125) . '()' . chr(59) . ' ' . (chr(10)) . '    return <-p' . chr(59) . ' ' . (chr(10)) . chr(125) . ' ' . ')'))
            };
            ('func ' . $self->{name} . '(v Capture) *Any ' . chr(123) . ' ' . '    ' . ($self->{sig})->emit_go_bind() . (chr(10)) . '    p :' . chr(61) . ' make(chan *Any)' . chr(59) . ' go func () ' . chr(123) . ' ' . (chr(10)) . '        ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))), ('needs_return' => 1), ('top_level' => 1)))->emit_go() . chr(59) . ' p <- nil ' . chr(125) . '()' . chr(59) . ' ' . (chr(10)) . '    return <-p' . chr(59) . ' ' . (chr(10)) . ' ' . chr(125))
        }
    }

;
    {
    package Do;
        sub new { shift; bless { @_ }, "Do" }
        sub emit_go {
            my $self = $_[0];
            ('(func () *Any ' . chr(123) . ' ' . (Perlito6::Go::LexicalBlock->new(('block' => (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY')))), ('needs_return' => 1)))->emit_go() . chr(59) . ' return u_undef() ' . chr(125) . ')()')
        }
    }

;
    {
    package Use;
        sub new { shift; bless { @_ }, "Use" }
        sub emit_go {
            my $self = $_[0];
            (chr(47) . chr(47) . ' use ' . $self->{mod} . (chr(10)))
        }
    }


}

1;
