Author: larry
Date: Wed May  3 10:42:06 2006
New Revision: 9111

Modified:
   doc/trunk/design/syn/S06.pod

Log:
Typos, clarifications for return, call, and leave.


Modified: doc/trunk/design/syn/S06.pod
==============================================================================
--- doc/trunk/design/syn/S06.pod        (original)
+++ doc/trunk/design/syn/S06.pod        Wed May  3 10:42:06 2006
@@ -15,7 +15,7 @@
   Date: 21 Mar 2003
   Last Modified: 3 May 2006
   Number: 6
-  Version: 32
+  Version: 33
 
 
 This document summarizes Apocalypse 6, which covers subroutines and the
@@ -1542,7 +1542,7 @@
 
     my sub wanda ($x) returns Fish { ... }
 
-It is possible for the outer type to disagree with the outside type:
+It is possible for the outer type to disagree with the inner type:
 
     my Squid sub wanda ($x) returns Fish { ... }
 
@@ -1738,6 +1738,14 @@
 
 =head2 The C<return> function
 
+The C<return> function notionally throws a control exception that is caught
+by the current lexically enclosing C<Routine> to force a return through
+the control logic code of any intermediate block constructs.  With normal
+blocks this can be optimized away to a "goto".  All C<Routine> declarations
+have an explicit declarator such as C<sub> or C<method>; bare blocks and
+"pointy" subs are never considered to be routines in that sense.  To return
+from a block, use C<leave> instead--see below.
+
 The C<return> function preserves its argument list as a C<Capture> object, and
 responds to the left-hand C<Signature> in a binding.  This allows named return
 values if the caller expects one:
@@ -1762,17 +1770,17 @@
     return ( :x<1>, :y<2> ); # two positional Pair objects
 
 If the function ends with an expression without an explicit C<return>,
-that expression is also taken to be a C<Capture>, just as if expression
+that expression is also taken to be a C<Capture>, just as if the expression
 were the argument to a C<return> list operator (with whitespace):
 
     sub f { :x<1> } # named-argument binding (if caller uses *)
     sub f { (:x<1>) } # always just one positional Pair object 
 
 On the caller's end, the C<Capture> is interpolated into any new argument list
-much like an array would be, that is, as a scalar in scalar context, and as
-a list in list context.  This is the default behavior, but as with an array,
-the caller may use C<< prefix:<*> >> to inline the returned values as part of
-the new argument list.  The caller may also bind the return Capture directly.
+much like an array would be, that is, as a scalar in scalar context, and as a
+list in list context.  This is the default behavior, but as with an array, the
+caller may use C<< prefix:<*> >> to inline the returned values as part of the
+new argument list.  The caller may also bind the returned C<Capture> directly.
 
 =head2 The C<caller> function
 
@@ -1834,7 +1842,7 @@
     leave Method;               # return from innermost calling method
     leave &?SUB <== 1,2,3;      # Return from current sub. Same as: return 
1,2,3
     leave &foo <== 1,2,3;       # Return from innermost surrounding call to 
&foo
-    leave Loop, :label<COUNT>;  # Same as: last COUNT;
+    leave Loop where { .label eq 'COUNT' };  # Same as: last COUNT;
 
 Note that the last is equivalent to
 
@@ -1844,6 +1852,10 @@
 
     last COUNT <== 42;
 
+If supplied, the first argument to C<leave> is a C<Selector>, and will
+be smart-matched against the dynamic scope objects from inner to outer.
+The first that matches is the scope that is left.
+
 =head2 Temporization
 
 The C<temp> function temporarily replaces the value of an existing
@@ -1961,10 +1973,10 @@
 Outside a wrapper, C<call> implicitly calls the next-most-likely method
 or multi-sub; see S12 for details.
 
-As with any return value, you may capture the returned C<Capture> of call
+As with any return value, you may capture the returned C<Capture> of C<call>
 by binding:
 
-    my \$retval = call(*$args);
+    my \$retval := call(*$args);
     ... # postprocessing
     return *$retval;
 

Reply via email to