On Thu, Feb 14, 2008 at 04:16:02PM -0700, Thom Boyer wrote:
> S02 says "A bare closure also interpolates in double-quotish context."
> I presume that there are no restrictions on the code inside that closure, 
> but all the examples I've seen have nothing but expressions inside the 
> closure (though some examples, admittedly, do invoke subs and/or methods).
> Question 1: Does
>     my $s = ''
>     say "Fire in the hole!{
>         for reverse 1 .. 3 { $s = qq[$s $_]; }
>         $s
>       } BOOM!";
> work? I.e., does it say this?
>     Fire in the hole! 3 2 1 BOOM!
> I'm not arguing that embedding that much code in a string is good style. 
> I'm just asking if it's forbidden.

It's perfectly legal.  All closures in Perl 6 allow multiple statements.

> Question 2: Does C<for> return the value of its last statement? In other 
> words, does this have the same effect as the previous example?
>     my $s = '';
>     say "Fire in the hole!{for reverse 1..3 { $s = qq[$s $_] }} BOOM!";

All complete iterations return their final value as a list.  Therefore
that code will print

    Fire in the hole! 3 3 2 3 2 1 BOOM!

which is likely to confuse your hired help.  What you want is just

    say "Fire in the hole!{for reverse 1..3 { $_ }} BOOM!";

This is described under Loop Statements in S04.

> Question 3: Do quotes inside a closure inside a string get parsed exactly 
> as if they were in code, or do they screw up the scanning of the outermost 
> string? If the closure contains "real" code, then I should be able to 
> replace qq[$s $_] with "$s $_" in the example. Does this work?
>     my $s = '';
>     say "Fire in the hole!{for reverse 1..3 { $s = "$s $_" }} BOOM!";
>     # does this quote end the scan of string? -----^

No, there's no problem with that.  This is Perl 6, which is full of
wonderfulness, not Perl 5, which was written by a person of minimal clue. :)

That's part of what S02 means right at the top where it's talking
about a one-pass parser.  There's no lookahead to find the end of a
construct.  You just come to it when you come to it, and the parser
has to be smart enough to know which terminators mean what in each


Reply via email to