On Tue Jul 27 18:07:28 2010, coke wrote: > On Fri Feb 13 20:46:31 2009, ch...@chrisdolan.net wrote: > > If you include statements in the body of a package, class, etc. > > declaration, those are executed at :load time which happens > > before :main. So, globals like @*ARGS which are set up in ! > > UNIT_START from :main are not yet established. All three of the > > following examples should have the same results, but the middle one > > is wrong. Either setup of globals needs to happen before :load, or > > the statements in the package, class, etc. need to be moved out > > of :load methods. I think the latter is better, since :load methods > > are like BEGIN blocks. > > > > ../../parrot perl6.pbc -e 'say "(", @*ARGS, ")";' f g h > > (fgh) > > > > ../../parrot perl6.pbc -e 'package Foo { say "(", @*ARGS, ")"; }' f > g h > > () > > > > ../../parrot perl6.pbc -e 'package Foo { sub run() { say "(", > @*ARGS, > > ")"; } }; Foo::run()' f g h > > (fgh) > > > > ... Now a /different/ two of these work: > > $ ./perl6 -e 'say "(", @*ARGS, ")";' f g h > (fgh) > $ ./perl6 -e 'package Foo { say "(", @*ARGS, ")"; }' f g h > (fgh) > $ ./perl6 -e 'package Foo { sub run() { say "(", @*ARGS, ")"; } }; > Foo::run()' f g h > Can not find sub Foo::run > in main program body at line 1 > >
jnthn++ points out that this last failure is correct. This should be written: $ ./perl6 -e 'package Foo { our sub run() { say "(", @*ARGS, ")"; } }; Foo::run()' f g h (fgh) which works. Assigning to moritz for spectesting. -- Will "Coke" Coleda