Author: audreyt Date: Wed Apr 2 10:22:01 2008 New Revision: 14536 Modified: doc/trunk/design/syn/S04.pod
Log: * S04: Create a new section, "Statement-level bare blocks" since its content doesn't really belong in the "do-once loop" section. * S04: Also, clarify that statement-level blocks with placeholder variables should trigger an error, unless prefixed with "do" or postfixed with a modifier. Modified: doc/trunk/design/syn/S04.pod ============================================================================== --- doc/trunk/design/syn/S04.pod (original) +++ doc/trunk/design/syn/S04.pod Wed Apr 2 10:22:01 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 19 Aug 2004 - Last Modified: 8 Feb 2008 + Last Modified: 2 Apr 2008 Number: 4 - Version: 64 + Version: 65 This document summarizes Apocalypse 4, which covers the block and statement syntax of Perl. @@ -533,15 +533,6 @@ useful for the do-once block, since it is offically a loop and can take therefore loop control statements. -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>.) - Another consequence of this is that any block just inside a left parenthesis is immediately called like a bare block, so a multidimensional list comprehension may be written using a block with @@ -553,6 +544,32 @@ @names = ({ "$^name.$^num" } for 'a'..'zzz' X 1..100); +=head2 Statement-level bare blocks + +Although a bare block occuring as a single statement 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 in statement-level blocks triggers a +syntax error, because the parameter is not out front where it can be +seen. However, it's not an error when prefixed by a C<do>, or when +followed by a statement modifier: + + # Syntax error: Statement-level placeholder block + { say $^x }; + + # Not an syntax error, though $x doesn't get the argument it wants + do { say $^x }; + + # Not an error: Equivalent to "for 1..10 -> $x { say $x }" + { say $^x } for 1..10; + + # Not an error: Equivalent to "if foo() -> $x { say $x }" + { say $^x } if foo(); =head2 The gather statement