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 Cfor 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