Author: lwall
Date: 2009-09-05 02:17:53 +0200 (Sat, 05 Sep 2009)
New Revision: 28188

Modified:
   docs/Perl6/Spec/S04-control.pod
Log:
[S04] clarify semantics of break for masak++


Modified: docs/Perl6/Spec/S04-control.pod
===================================================================
--- docs/Perl6/Spec/S04-control.pod     2009-09-04 01:00:18 UTC (rev 28187)
+++ docs/Perl6/Spec/S04-control.pod     2009-09-05 00:17:53 UTC (rev 28188)
@@ -13,8 +13,8 @@
 
     Created: 19 Aug 2004
 
-    Last Modified: 3 Jul 2009
-    Version: 81
+    Last Modified: 4 Sep 2009
+    Version: 82
 
 This document summarizes Apocalypse 4, which covers the block and
 statement syntax of Perl.
@@ -813,17 +813,30 @@
 
 You can explicitly break out of a C<when> block (and its surrounding
 topicalizer block) early using the C<break> verb.  More precisely,
-it leaves the innermost block outside the C<when> that uses C<$_>
-as one of its formal parameters, either explicitly or implicitly.
-It does this essentially by going to the end of the block and
-returning normally from that block.  In other words, a break (either
-implicit or explicit) is assumed to indicate success, not failure.
+it first scans outward (lexically) for the innermost containing
+C<when> block.  From there it continues to scan outward to find the
+innermost block outside the C<when> that uses C<$_> as one of its
+formal parameters, either explicitly or implicitly.  (Note that
+both of these scans are done at compile time; if the scans fail,
+it's a compile-time semantic error.)  Typically, such an outer
+block will be a C<given> or a C<for> statement, but any block that
+sets the topic in its signature can be broken out of.  At run time,
+C<break> uses a control exception to scan up the dynamic chain to
+find the activation record belonging to that same outer block, and
+when it has found that scope, it does a C<.leave> on it to unwinde
+the contexts.  If any arguments are supplied to the C<break> function,
+they are passed out via the C<leave> method.  Since leaving a block is
+considered a successful return, breaking out of one is also considered
+a successful return.  (And in fact, the implicit break of a normal
+C<when> block works the same way, returning the value of the final
+statement via an implicit C<.leave>.)
 
 You can explicitly leave a C<when> block and go to the next statement
 following the C<when> by using C<continue>.  (Note that, unlike C's
 idea of "falling through", subsequent C<when> conditions are evaluated.
 To jump into the next C<when> block without testing its condition,
-you must use a C<goto>.)
+you must use a C<goto>.  But generally that means you should refactor
+instead.)
 
 If you have a switch that is the main block of a C<for> loop, and
 you break out of the switch either implicitly or explicitly (that is,

Reply via email to