2009-12-02

Code Wanted: Abstract Syntax Tree to Perl Code compiler

WANTED:

use AST::Assembler qw( :all );

# Code Generation Via AST.

my $code = context( 
  package_def('Foo', context(
        use_declaration('Moose'),
        call_sub('with', package => CURRENTCONTEXT, args => list( 'Some::Role' )),
        def_sub('bar', context( 
           def_var(['x','y','z], 'context' => CURRENTCONTEXT),
           assign(['x','y','z',], STACK ),
           assign('z', add('x','y')),
           return('z'),
        ))
  ))
);

# AST Augmentation.
$code->find('def_sub')->grep(sub{ $_[0] eq 'bar' })->find('assign')->grep(sub{ $_[0] eq 'z' })->before(assign('x',sub(0,'x')));

my $codestr = $code->to_perl; 

# -->
package Foo;
use Moose;
with "Some::Role";
sub bar { 
  my ( $x,$y, $z);
  ($x,$y,$z) = (@_);
  $x = 0 - $x;  # inserted by augmentation.
  $z = ( $x + $y )
  return $z;
}   
$code->optimise->to_perl
package Foo;
use Moose;
with "Some::Role";
sub bar { 
  return ( ( 0 - $_[0] ) + $_[1] )
}
$code->find('package_def', [ 0 , 'eq' , 'Foo' ])->child('context')->append(callsub('bar',args=>list('1','2','3')));

$code->optimise->to_perl
package Foo;
use Moose;
with "Some::Role";
sub bar { 
  return ( ( 0 - $_[0] ) + $_[1] )
}

( ( 0 - '1' ) + '2' )

Its just an insane starting point for code generation. Somebody run with it and make it not suck :)

Once we get a working AST to Perl code thing, maybe somebody can consider doing the inverse ;)

No comments:

Post a Comment