Changeset 14980

Show
Ignore:
Timestamp:
01/02/07 14:04:48 (23 months ago)
Author:
fglock
Message:

mp6-mo - method calls now use 'method_call()' instead of '->'

Location:
v6/v6-MiniPerl6-MO
Files:
1 removed
3 modified

Legend:

Unmodified
Added
Removed
  • v6/v6-MiniPerl6-MO/lib/MiniPerl6/Perl5/Emitter.pm

    r14978 r14980  
    11use v6-alpha; 
    22 
    3 class CompUnit { 
     3# Perl5MO emitter 
     4 
     5class Module { 
    46    has $.name; 
    5     has %.attributes; 
    6     has %.methods; 
    77    has @.body; 
    88    method emit { 
    9         'package ' ~ $.name ~ "; " ~  
    10         'sub new { shift; bless { @_ }, "' ~ $.name ~ '" }' ~ " " ~ 
    11         (@.body.>>emit).join( "; " ) 
     9        my $a := @.body; 
     10        my $item; 
     11        my $s; 
     12        $s := $s  
     13            ~ 'package ' ~ $.name ~ ';' ~ Main::newline(); 
     14        for @$a -> $item { 
     15            $s := $s ~ $item.emit ~ ';' ~ Main::newline(); 
     16        }; 
     17        return $s; 
    1218    } 
    1319} 
     
    259265        }; 
    260266         
    261         my $call := '->' ~ $meth ~ '(' ~ (@.arguments.>>emit).join(', ') ~ ')'; 
    262267        if ($.hyper) { 
    263             '[ map { $_' ~ $call ~ ' } @{ ' ~ $invocant ~ ' } ]'; 
     268            '[ map { ' 
     269           ~ 'MO::Run::Aux::method_call( '  
     270           ~   '$_'  
     271           ~   ', q(' ~ $meth ~ '), ' 
     272           ~   (@.arguments.>>emit).join(', ')  
     273           ~ ')' 
     274           ~ ' } @{ ' ~ $invocant ~ ' } ]'; 
    264275        } 
    265276        else { 
    266             $invocant ~ $call; 
     277             'MO::Run::Aux::method_call( '  
     278           ~   $invocant  
     279           ~   ', q(' ~ $meth ~ '), ' 
     280           ~   (@.arguments.>>emit).join(', ')  
     281           ~ ')'; 
    267282        }; 
    268283 
     
    316331    has $.result; 
    317332    method emit { 
    318         return 
    319         #'do { print Main::perl(caller(),' ~ $.result.emit ~ '); return(' ~ $.result.emit ~ ') }'; 
    320333        'return(' ~ $.result.emit ~ ')'; 
    321334    } 
     
    390403 
    391404        my $pos := $sig.positional; 
    392         my $str := 'my $List__ = \@_; ';   # no strict "vars"; '; 
    393  
    394         # TODO - follow recursively 
    395         my $pos := $sig.positional; 
    396         for @$pos -> $field {  
    397             $str := $str ~ 'my ' ~ $field.emit ~ '; '; 
    398         }; 
    399  
     405        my $str := 'my $List__ = \@_; no strict "vars"; '; 
    400406        my $bind := ::Bind(  
    401407            'parameters' => ::Lit::Array( array => $sig.positional ),  
     
    412418#        }; 
    413419 
    414         'sub ' ~ $.name ~ ' { ' ~  
     420        'sub { ' ~  
    415421          'my ' ~ $invocant.emit ~ ' = shift; ' ~ 
    416422          $str ~ 
     
    431437        # say $invocant.emit; 
    432438        my $pos := $sig.positional; 
    433         my $str := 'my $List__ = \@_; ';  # no strict "vars"; '; 
    434  
    435         # TODO - follow recursively 
    436         my $pos := $sig.positional; 
    437         for @$pos -> $field {  
    438             $str := $str ~ 'my ' ~ $field.emit ~ '; '; 
    439         }; 
     439        my $str := 'my $List__ = \@_; no strict "vars"; '; 
    440440 
    441441        my $bind := ::Bind(  
  • v6/v6-MiniPerl6-MO/lib5/MiniPerl6/Perl5/Emitter.pm

    r14978 r14980  
    44use MiniPerl6::Perl5::Runtime; 
    55use MiniPerl6::Perl5::Match; 
    6 package CompUnit; sub new { shift; bless { @_ }, "CompUnit" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub attributes { @_ == 1 ? ( $_[0]->{attributes} ) : ( $_[0]->{attributes} = $_[1] ) }; sub methods { @_ == 1 ? ( $_[0]->{methods} ) : ( $_[0]->{methods} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('package ' . ($self->{name} . ('; ' . ('sub new { shift; bless { @_ }, "' . ($self->{name} . ('" }' . (' ' . Main::join([ map { $_->emit() } @{ $self->{body} } ], '; ')))))))) } 
     6package Module; sub new { shift; bless { @_ }, "Module" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $a = $self->{body}; my  $item; my  $s; $s = ($s . ('package ' . ($self->{name} . (';' . Main::newline())))); do { for my $item ( @{$a} ) { $s = ($s . ($item->emit() . (';' . Main::newline()))) } }; return($s) } 
    77; 
    88package Val::Int; sub new { shift; bless { @_ }, "Val::Int" } sub int { @_ == 1 ? ( $_[0]->{int} ) : ( $_[0]->{int} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; $self->{int} } 
     
    3838package Proto; sub new { shift; bless { @_ }, "Proto" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ("" . $self->{name}) } 
    3939; 
    40 package Call; sub new { shift; bless { @_ }, "Call" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub hyper { @_ == 1 ? ( $_[0]->{hyper} ) : ( $_[0]->{hyper} = $_[1] ) }; sub method { @_ == 1 ? ( $_[0]->{method} ) : ( $_[0]->{method} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $invocant = $self->{invocant}->emit(); do { if (($invocant eq 'self')) { $invocant = '$self' } else {  } }; do { if ((($self->{method} eq 'perl') || (($self->{method} eq 'yaml') || (($self->{method} eq 'say') || (($self->{method} eq 'join') || (($self->{method} eq 'chars') || ($self->{method} eq 'isa'))))))) { do { if ($self->{hyper}) { return(('[ map { Main::' . ($self->{method} . ('( $_, ' . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]'))))))))) } else { return(('Main::' . ($self->{method} . ('(' . ($invocant . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))))))) } } } else {  } }; my  $meth = $self->{method}; do { if (($meth eq 'postcircumfix:<( )>')) { $meth = '' } else {  } }; my  $call = ('->' . ($meth . ('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')')))); do { if ($self->{hyper}) { ('[ map { $_' . ($call . (' } @{ ' . ($invocant . ' } ]')))) } else { ($invocant . $call) } } } 
     40package Call; sub new { shift; bless { @_ }, "Call" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub hyper { @_ == 1 ? ( $_[0]->{hyper} ) : ( $_[0]->{hyper} = $_[1] ) }; sub method { @_ == 1 ? ( $_[0]->{method} ) : ( $_[0]->{method} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $invocant = $self->{invocant}->emit(); do { if (($invocant eq 'self')) { $invocant = '$self' } else {  } }; do { if ((($self->{method} eq 'perl') || (($self->{method} eq 'yaml') || (($self->{method} eq 'say') || (($self->{method} eq 'join') || (($self->{method} eq 'chars') || ($self->{method} eq 'isa'))))))) { do { if ($self->{hyper}) { return(('[ map { Main::' . ($self->{method} . ('( $_, ' . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]'))))))))) } else { return(('Main::' . ($self->{method} . ('(' . ($invocant . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))))))) } } } else {  } }; my  $meth = $self->{method}; do { if (($meth eq 'postcircumfix:<( )>')) { $meth = '' } else {  } }; do { if ($self->{hyper}) { ('[ map { ' . ('MO::Run::Aux::method_call( ' . ('$_' . (', q(' . ($meth . ('), ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]')))))))))) } else { ('MO::Run::Aux::method_call( ' . ($invocant . (', q(' . ($meth . ('), ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')')))))) } } } 
    4141; 
    4242package Apply; sub new { shift; bless { @_ }, "Apply" } sub code { @_ == 1 ? ( $_[0]->{code} ) : ( $_[0]->{code} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $code = $self->{code}; do { if (($code eq 'say')) { return(('Main::say(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } else {  } }; do { if (($code eq 'print')) { return(('Main::print(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } else {  } }; do { if (($code eq 'array')) { return(('@{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else {  } }; do { if (($code eq 'prefix:<~>')) { return(('("" . ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ')'))) } else {  } }; do { if (($code eq 'prefix:<!>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ' ? 0 : 1)'))) } else {  } }; do { if (($code eq 'prefix:<?>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ' ? 1 : 0)'))) } else {  } }; do { if (($code eq 'prefix:<$>')) { return(('${' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else {  } }; do { if (($code eq 'prefix:<@>')) { return(('@{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else {  } }; do { if (($code eq 'prefix:<%>')) { return(('%{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else {  } }; do { if (($code eq 'infix:<~>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' . ') . ')'))) } else {  } }; do { if (($code eq 'infix:<+>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' + ') . ')'))) } else {  } }; do { if (($code eq 'infix:<->')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' - ') . ')'))) } else {  } }; do { if (($code eq 'infix:<&&>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' && ') . ')'))) } else {  } }; do { if (($code eq 'infix:<||>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' || ') . ')'))) } else {  } }; do { if (($code eq 'infix:<eq>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' eq ') . ')'))) } else {  } }; do { if (($code eq 'infix:<ne>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ne ') . ')'))) } else {  } }; do { if (($code eq 'infix:<==>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' == ') . ')'))) } else {  } }; do { if (($code eq 'infix:<!=>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' != ') . ')'))) } else {  } }; do { if (($code eq 'ternary:<?? !!>')) { return(('(' . ($self->{arguments}->[0]->emit() . (' ? ' . ($self->{arguments}->[1]->emit() . (' : ' . ($self->{arguments}->[2]->emit() . ')'))))))) } else {  } }; ($self->{code} . ('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } 
    4343; 
    44 package Return; sub new { shift; bless { @_ }, "Return" } sub result { @_ == 1 ? ( $_[0]->{result} ) : ( $_[0]->{result} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; return(('return(' . ($self->{result}->emit() . ')'))) } 
     44package Return; sub new { shift; bless { @_ }, "Return" } sub result { @_ == 1 ? ( $_[0]->{result} ) : ( $_[0]->{result} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('return(' . ($self->{result}->emit() . ')')) } 
    4545; 
    4646package If; sub new { shift; bless { @_ }, "If" } sub cond { @_ == 1 ? ( $_[0]->{cond} ) : ( $_[0]->{cond} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub otherwise { @_ == 1 ? ( $_[0]->{otherwise} ) : ( $_[0]->{otherwise} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('do { if (' . ($self->{cond}->emit() . (') { ' . (Main::join([ map { $_->emit() } @{ $self->{body} } ], ';') . (' } else { ' . (Main::join([ map { $_->emit() } @{ $self->{otherwise} } ], ';') . ' } }')))))) } 
     
    5252package Sig; sub new { shift; bless { @_ }, "Sig" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub positional { @_ == 1 ? ( $_[0]->{positional} ) : ( $_[0]->{positional} = $_[1] ) }; sub named { @_ == 1 ? ( $_[0]->{named} ) : ( $_[0]->{named} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ' print \'Signature - TODO\'; die \'Signature - TODO\'; ' }; sub invocant { my $self = shift; my $List__ = \@_; do { [] }; $self->{invocant} }; sub positional { my $self = shift; my $List__ = \@_; do { [] }; $self->{positional} } 
    5353; 
    54 package Method; sub new { shift; bless { @_ }, "Method" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $sig = $self->{sig}; my  $invocant = $sig->invocant(); my  $pos = $sig->positional(); my  $str = 'my $List__ = \@_; '; my  $pos = $sig->positional(); do { for my $field ( @{$pos} ) { $str = ($str . ('my ' . ($field->emit() . '; '))) } }; my  $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ('my ' . ($invocant->emit() . (' = shift; ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')))))))) } 
     54package Method; sub new { shift; bless { @_ }, "Method" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $sig = $self->{sig}; my  $invocant = $sig->invocant(); my  $pos = $sig->positional(); my  $str = 'my $List__ = \@_; no strict "vars"; '; my  $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub { ' . ('my ' . ($invocant->emit() . (' = shift; ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')))))) } 
    5555; 
    56 package Sub; sub new { shift; bless { @_ }, "Sub" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $sig = $self->{sig}; my  $pos = $sig->positional(); my  $str = 'my $List__ = \@_; '; my  $pos = $sig->positional(); do { for my $field ( @{$pos} ) { $str = ($str . ('my ' . ($field->emit() . '; '))) } }; my  $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }'))))) } 
     56package Sub; sub new { shift; bless { @_ }, "Sub" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my  $sig = $self->{sig}; my  $pos = $sig->positional(); my  $str = 'my $List__ = \@_; no strict "vars"; '; my  $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }'))))) } 
    5757; 
    5858package Do; sub new { shift; bless { @_ }, "Do" } sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('do { ' . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')) } 
  • v6/v6-MiniPerl6-MO/mp6-perl5-mo.pl

    r14978 r14980  
    1414package Main; 
    1515use MiniPerl6::Grammar; 
    16 use MiniPerl6::Perl5MO::Emitter; 
     16use MiniPerl6::Perl5::Emitter; 
    1717use MiniPerl6::Grammar::Regex; 
    1818use MiniPerl6::Emitter::Token; 
     
    2727say( "use MiniPerl6::Perl5::Match;" ); 
    2828 
     29#say( "use MO::Run::Aux;" ); 
     30#say( "BEGIN { $MO::Run::Aux::MO_NATIVE_RUNTIME = 1 }"); 
     31 
    2932while ( $pos < length( $source ) ) { 
    3033    #say( "Source code:", $source );