Author: larry Date: Fri Jul 21 12:52:51 2006 New Revision: 10350 Modified: doc/trunk/design/syn/S04.pod
Log: s/loop/repeat/ for test-after loops Modified: doc/trunk/design/syn/S04.pod ============================================================================== --- doc/trunk/design/syn/S04.pod (original) +++ doc/trunk/design/syn/S04.pod Fri Jul 21 12:52:51 2006 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 19 Aug 2004 - Last Modified: 19 July 2006 + Last Modified: 21 July 2006 Number: 4 - Version: 28 + Version: 29 This document summarizes Apocalypse 4, which covers the block and statement syntax of Perl. @@ -175,6 +175,14 @@ =head1 Loop statements +Looping statement modifiers are the same as in Perl 5. +Loop modifiers C<next>, C<last>, and C<redo> also work as in Perl 5. + +There is no longer a C<continue> block. Instead, use a C<NEXT> block +within the body of the loop. See below. + +=head2 The C<while> and C<until> statements + The C<while> and C<until> statements work as in Perl 5, except that you may leave out the parentheses around the conditional: @@ -182,26 +190,59 @@ ... } -Looping statement modifiers are the same as in Perl 5, except that -to avoid confusion applying one to a C<do> block is specifically -disallowed. Instead of +=head2 The C<repeat> statement + +Unlike in Perl 5, applying a statement modifier to a C<do> block is +specifically disallowed: + do { ... - } while $x; + } while $x < 10; # ILLEGAL -you should write +Instead, you should write the more Pascal-like C<repeat> loop: - loop { + repeat { ... - } while $x; + } while $x < 10; -Loop modifiers C<next>, C<last>, and C<redo> work as in Perl 5. +or equivalently: -There is no longer a C<continue> block. Instead, use a C<NEXT> block -within the loop. See below. + repeat { + ... + } until $x >= 10; + +Unlike Perl 5's C<do-while> loop, this is a real loop block now, so +C<next>, C<last>, and C<redo> work as expected. The loop conditional +on a repeat block is required, so it will be recognized even if you +put it on a line by its own: -=head1 The general loop statement + repeat + { + ... + } + while $x < 10; + +However, that's likely to be visually confused with a following +C<while> loop at the best of times, so it's also allowed to put the +loop conditional at the front, with the same meaning (the C<repeat> +keyword forces the conditional to be evaluated at the end of the loop, +so it's still C's do-while semantics.) Therefore, even under GNU style +rules, the previous example may be rewritten into a very clear: + + repeat while $x < 10 + { + ... + } + +or equivalently: + + repeat until $x >= 10 + { + ... + } + +=head2 The general loop statement The C<loop> statement is the C-style C<for> loop in disguise: @@ -210,13 +251,16 @@ } As in C, the parentheses are required if you supply the 3-part spec; however, -as shown in the previous section, the 3-part loop spec may be entirely -omitted to write an infinite loop. If you omit the 3-part loop spec -you may add a C<while> or C<until> statement modifier at the end -to make it a "repeat at least once" loop. Unlike C<do> in Perl 5, -it's a real loop block, so you may use loop modifiers. +the 3-part loop spec may be entirely omitted to write an infinite loop. +That is, + + loop {...} + +is equivalent to the Cish idiom: + + loop (;;) {...} -=head1 The C<for> statement +=head2 The C<for> statement There is no C<foreach> statement any more. It's always spelled C<for> in Perl 6, so it always takes a list as an argument: @@ -293,12 +337,12 @@ compiler may have to retroactively change the binding of <$_> on the left side. But it's what people expect of a pronoun like "it".) -=head1 The do-once loop +=head2 The do-once loop In Perl 5, a bare block is deemed to be a do-once loop. In Perl 6, the bare block is not a do-once. Instead C<do {...}> is the do-once loop (which is another reason you can't put a C<while> or C<until> -modifier on it). +modifier on it; use C<repeat> for that). For any statement, prefixing with a C<do> allows you to return the value of that statement and use it in an expression: