pX/Common/iterator_engine/TASKS - fglock Bootstrapping: ok - core rule engine - backtracking, function composition - in Perl 5 ok - Perl 6 rules in Perl 5 - reuse to write itself ok - Perl 6 grammar in Perl 5 - reuse to write itself ok - Perl 6 to Perl 5 translator (parse p6, emit p5) - reuse to write itself - Perl 6 compiler written in p6 - emitted to p5 - Integrate with Pugs features - see discussions in #perl6, Notes, Deal.txt Next possible milestone: ok - rewrite iterator_engine.pl in Perl 6, - compile to Perl 5, - use it instead of the original iterator_engine.pl In order to implement new syntax: 1 - optimize macro expansion 2 - or: implement statements in perl5 (as new nodes) 3 - keep using macros as-is, and optimize later - option 1 is clean, but hard to do. - option 2 is unclean, easier to do, but the final result in speed is about the same. - option 3 is good, but may get unusable because of slowness Current tasks: - make an automatic backup of the previous compiler before building a new prelude - migrate all remaining rules from p5 to p6 (only a few last) - implement 'macro' and '<%hash>', in order to define 'if' as in S04-Statement parsing - organize grammar categories: statement_control, prefix, infix - implement operator precedence - migrate primitives from http://svn.pugscode.org/pugs/src/Pugs/Prim.hs - find out more about grammar bootstrapping and the parse/compile/run cycle and BEGIN/CHECK/INIT - see TODO and XXX notes everywhere - split Prelude into base-syntax and primitives - fix Perl 6 syntax errors in Prelude - usage of $<>, ... More tasks: - implement syntax options: - default parser for macros - short operator names infix:<+> === + - use putter's Match.pm - bind special variables $0, ... - see also the 'not implemented' rule list below - optimize infix:<+> to 'native +' when possible - mixing boxed/unboxed types (there are several tools available - which one to use?) - Perl 6 OO - which tools to use? - talk to stevan - un-source-filter rule return blocks - un-source-filter macro variable binding - coroutines Other interesting things to do (low priority): - reimplement iterator_engine.pl in - Javascript - I like the 'run in the browser' idea very much - Perl 6 - Perl 6 version could be started with a source filter, since the syntax used is very simple - Parrot - not so useful - Parrot already has PGE - test the compiler in Perl 5.5x - try out Smart::Comments - move project to a new subdir and give it a name? - Extract 'Changes' and 'TODO' from README (extract old Changes from svn) - make rule/grammar a pluggable module (pack for CPAN?) how about "Perl6::Grammar", and reuse Parse::RecDescent API? - make grammars inherit from Grammar; make grammars inheritable - write an emitter that generates perl5 regexes (or dies) - implement "Rule|Str" with caching in <$var> rule - pluggable emitters - emit Pugs-compatible YAML - import Pugs-generated YAML precompiled code - regex options :s :Perl5 ... Possible difficult problems to fix (all untested): - package-wide lexical variables (incremental compilation and execution doesn't work with lexicals) - modifying the grammar from inside a block (incremental compilation is currently disabled inside blocks) - clonable closures (needed for proper working lazy lists) Cleanup namespaces: - find out what are the right names, such as: Grammar - the base grammar - defines , RuleGrammar - the pattern matching grammar (or ???) Perl6Grammar - the Perl6 grammar (or Perl6 ???) --------------------------------- From p6compiler.pl - # XXX - make grammars inherit from Grammar; make grammars inheritable # XXX - write an emitter that generates perl5 regexes (or dies) # XXX - add (API/documentation) to generate unnamed rules, unnamed grammars # XXX - fix the extra commas in the generated code # XXX - create error messages for compiling errors =for later rule sub_application { <@grammar1::terms> ? <@grammar1::ops> ? <@grammar1::terms> } push @terms, \&sub_application; # XXX - this doesn't work # say sub { print 'anonymous sub'; } ; rule anon_sub { sub { return { anon_sub => $ ,} } } push @terms, \&anon_sub; rule assignment { $lvalue := () ? \= ? $rvalue := () ? \; { return { assignment => [ $, $ ] ,} } } unshift @terms, \&assignment; rule eval_perl5 { eval ? \( ? \" \" ? \, ? \:lang\ ? \) ? \; } # sub print ... # sub 'Y' - is assoc 'list' # sub infix:<+> { eval( '$_[0]+$_[1]', :lang ) } # print '1' + '1'; # $a = $b; # TODO - $a = $b; - see 'rule assignment' above # TODO - rule comment { \# .*? [|$$] } =cut --- from file p6prelude.pl =for TODO reimplement print(), warn ... using 'sub' implement eval_perl6 and eval_block operand fixity (infix, prefix...) operand precedence (+, *, ln) class find out how to change syntax while in the parse-and-generate-ast phase (for example, when a new sub is created) macros =cut