Changeset 22500

Show
Ignore:
Timestamp:
10/03/08 20:11:15 (7 weeks ago)
Author:
pmurias
Message:

[mildew] anonymous subroutines

Location:
v6/mildew
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • v6/mildew/mildew

    r22499 r22500  
    3131    } elsif ($m->{value}) { 
    3232        value($m->{value}); 
     33    } elsif ($m->{routine_declarator}) { 
     34        if ($m->{routine_declarator}{routine_def}) { 
     35            routine_def($m->{routine_declarator}{routine_def}); 
     36        } else { 
     37            XXX; 
     38        } 
     39    } else { 
     40        XXX; 
    3341    } 
     42} 
     43sub routine_def { 
     44    my $m = shift; 
     45    AST::Call->new(identifier=>AST::StringConstant->new(value => 'new'), 
     46        capture => AST::Capture->new( 
     47            invocant => AST::Reg->new(name=>'Code'), 
     48            positional => [], 
     49            named => [ 
     50                AST::StringConstant->new(value=>'mold') => block($m->{block}), 
     51                AST::StringConstant->new(value=>'outer') => AST::Reg->new(name=>'$scope') 
     52            ] 
     53        ), 
     54    ); 
     55} 
     56sub block { 
     57    my $m = shift; 
     58    AST::Block->new(regs=>['interpreter','scope'],stmts=>statementlist($m->{in}{statementlist})); 
    3459} 
    3560sub value { 
  • v6/mildew/src/AST.pm

    r22499 r22500  
    2525extends 'AST::Base'; 
    2626has 'stmts' => (is=>'ro'); 
    27 has 'regs' => (is=>'ro'); 
     27has 'regs' => (is=>'ro',default=>sub {[]}); 
    2828sub m0ld { 
    2929    my ($self,$ret) = @_; 
     30    use YAML::XS; 
    3031    "my $ret = mold {\n" 
    3132        . join('',map {'my $'.$_.";\n"} @{$self->regs}) 
     
    6162=cut 
    6263 
     64package AST::Named; 
     65use Moose; 
     66extends 'AST::Base'; 
     67has 'key' => (is=>'ro'); 
     68has 'value' => (is=>'ro'); 
     69 
     70sub emit { 
     71    my $self = shift; 
     72    return ":".$self->key->emit."(".$self->value->emit.")"; 
     73} 
     74sub m0ld { 
     75    die "method m0ld is not supported on AST::Named\n" 
     76} 
     77 
    6378package AST::Call; 
    6479use Moose; 
     
    6984    my ($self,$ret) = @_; 
    7085    if ($self->capture->isa("AST::Capture")) { 
     86        my @args = @{$self->capture->positional}; 
     87        my @named = @{$self->capture->named}; 
     88        while (@named) { 
     89            push (@args,AST::Named->new(key=>shift @named,value=>shift @named)); 
     90        } 
    7191        "my $ret = " 
    7292        . $self->capture->invocant->emit 
    7393        . "." . $self->identifier->emit 
    74         . "(" . join('', map {$_->emit} @{$self->capture->positional}) . ");\n"; 
     94        . "(" . join('', map {$_->emit} @args) . ");\n"; 
    7595    } else { 
    7696    }