Author: lwall Date: 2009-11-24 21:31:37 +0100 (Tue, 24 Nov 2009) New Revision: 29187
Modified: docs/Perl6/Spec/S04-control.pod Log: [S04] clarifications suggested by TheDamian++ Modified: docs/Perl6/Spec/S04-control.pod =================================================================== --- docs/Perl6/Spec/S04-control.pod 2009-11-24 17:50:52 UTC (rev 29186) +++ docs/Perl6/Spec/S04-control.pod 2009-11-24 20:31:37 UTC (rev 29187) @@ -13,8 +13,8 @@ Created: 19 Aug 2004 - Last Modified: 19 Nov 2009 - Version: 89 + Last Modified: 24 Nov 2009 + Version: 90 This document summarizes Apocalypse 4, which covers the block and statement syntax of Perl. @@ -196,11 +196,21 @@ =head1 The Relationship of Blocks and Statements -The return value of a block is the value of its final statement. -(This is subtly different from Perl 5's behavior, which was to return +In the absence of explicit control flow terminating the block early, +the return value of a block is the value of its final statement. +This is defined as the textually last statement of its top-level +list of statements; any statements embedded within those top-level +statements are in their own lower-level list of statements and, +while they may be a final statement in their subscope, they're not +considered the final statement of the outer block in question. + +This is subtly different from Perl 5's behavior, which was to return the value of the last expression evaluated, even if that expression -was just a conditional.) If there are no statements in the block, -the result is C<Nil>. +was just a conditional. Unlike in Perl 5, if a final statement in +Perl 6 is a conditional that does not execute any of its branches, it +doesn't matter what the value of the condional is, the value of that +conditional statement is always C<Nil>. If there are no statements +in the block at all, the result is also C<Nil>. =head1 Statement-ending blocks @@ -919,6 +929,10 @@ doit() if $_ ~~ 42; +This is particularly useful for list comprehensions: + + @lucky = ($_ when /7/ for 1..100); + =head1 Exception handlers X<CATCH> @@ -1243,9 +1257,13 @@ sets the variable to 0 at C<END> time, since that is when the "my" declaration is actually executed. Only argumentless phasers may -use the statement form. This means that C<CHECK> and C<CONTROL> +use the statement form. This means that C<CATCH> and C<CONTROL> always require a block, since they take an argument that sets C<$_> -to the current topic. +to the current topic, so that the innards are able to behave +as a switch statement. (If bare statements were allowed, the +temporary binding of C<$_> would leak out past the end of the C<CATCH> +or C<CONTROL>, with unpredictable and quite possibly dire consequences. +Exception handlers are supposed to reduce uncertainty, not increase it.) Code that is generated at run time can still fire off C<CHECK> and C<INIT> phasers, though of course those phasers can't do things that