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
context.

Larry

Reply via email to