Author: larry
Date: Mon Jan 22 11:40:24 2007
New Revision: 13532

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

Log:
More list comprehension tweakage.


Modified: doc/trunk/design/syn/S04.pod
==============================================================================
--- doc/trunk/design/syn/S04.pod        (original)
+++ doc/trunk/design/syn/S04.pod        Mon Jan 22 11:40:24 2007
@@ -403,13 +403,24 @@
 
 This construct only allows you to attach a single statement to the end
 of an expression.  If you want to continue the expression after the
-statement, or if you want to attach multiple statements. you must use
-the curly form.  Since a bare expression may be used as a statement,
-you may use C<do> on an expression, but its only effect is to function
-as an unmatched left parenthesis, much like the C<$> operator in
-Haskell.  That is, precedence decisions do not cross a C<do> boundary.
-Conjectural: a C<do> may be used within a subexpression, but only if
-terminated by an unmatched right bracket of some kind.
+statement, or if you want to attach multiple statements. you must either
+use the curly form or surround the entire expression in brackets of some sort:
+
+    @primes = (do (do $_ if .prime) for 1..100);
+
+Since a bare expression may be used as a statement, you may use C<do>
+on an expression, but its only effect is to function as an unmatched
+left parenthesis, much like the C<$> operator in Haskell.  That is,
+precedence decisions do not cross a C<do> boundary, and the missing
+"right paren" is assumed at the next statement terminator or unmatched
+bracket.  A C<do> is assumed immediately after any opening bracket,
+so the above can in fact be written:
+
+    @primes = (($_ if .prime) for 1..100);
+
+This basically gives us list comprehensions as rvalue expressions:
+
+    (for 1..100 { $_ if .prime}).say
 
 Since C<do> is defined as going in front of a statement, it follows
 that it can always be followed by a statement label.  This is particularly
@@ -427,9 +438,11 @@
 
 A variant of C<do> is C<gather>.  Like C<do>, it is followed by a
 statement or block, and executes it once.  Unlike C<do>, its return
-value is a specified by calling the C<take> function one or more
-times within the dynamic scope of the gather.  The returned values are
-flattened into a lazy list.  A C<gather> is not considered a loop.
+value is a specified by calling the C<take> function one or more times
+within the dynamic scope of the gather.  The returned values are in
+the form of a lazy multidim list, with each dimension corresponding to
+one C<take> slice.  (A multidim is flattened in most list contexts.).
+A C<gather> is not considered a loop.
 
 Other similar C<Code>-only forms may also take bare statements,
 including C<try>, C<contend>, C<async>, and C<lazy>.  These constructs

Reply via email to