John M. Dlugosz 提到:

> But about your answer, "automatically called with no arguments". Isn't
> that what a bare closure normally does anyway? Say, I introduced extra
> {} just for scoping or naming the block, where a statement is expected.
> foo;
> bar;
> { my $temp= foo; bar(temp); } #forget about $temp.

Correct, but a pointy "-> $i {...}" is not bare, and neither is blocks
with placeholders such as "{ $^i }".

In fact, the latter is currently an error in Pugs:

$ ./pugs -e '{$^i}'
*** Blocks with implicit params cannot occur at statement level
    at -e line 1, column 1

The relevant paragraph is S04/"The do-once loop":

Although a bare block is no longer a do-once loop, it still executes
immediately as in Perl 5, as if it were immediately dereferenced with
a C<.()> postfix, so within such a block C<CALLER::> refers to the
scope surrounding the block.  If you wish to return a closure from a
function, you must use an explicit prefix such as C<return> or C<sub>
or C<< -> >>.  (Use of a placeholder parameter is deemed insufficiently
explicit because it's not out front where it can be seen.  You can, of
course, use a placeholder parameter if you also use C<return>.)

I guess the wording in the last parenthesized parens is insufficiently
explicit, and maybe we should change it to say that it's really a syntax
error to use placeholder blocks in statement positions.  Sounds reasonable?


Reply via email to