Author: larry Date: Tue Oct 14 17:14:18 2008 New Revision: 14595 Modified: doc/trunk/design/syn/S02.pod doc/trunk/design/syn/S04.pod doc/trunk/design/syn/S06.pod doc/trunk/design/syn/S09.pod doc/trunk/design/syn/S12.pod
Log: delete ambiguous use of {...} for hash unpacking, just use sigs for that (list unpacking may still be done with [...] for clarity) simplify parsing of expressions in conditionals to dwim on map/grep blocks (you now need to parenthesize only on listops called with 0 args, like caller) define .pick on enumerable types, e.g. Day.pick clean out old instances of rand ARG, esp. where used as example of 0-or-1-ary revamp obsolete usages of exists Modified: doc/trunk/design/syn/S02.pod ============================================================================== --- doc/trunk/design/syn/S02.pod (original) +++ doc/trunk/design/syn/S02.pod Tue Oct 14 17:14:18 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 10 Aug 2004 - Last Modified: 9 Oct 2008 + Last Modified: 14 Oct 2008 Number: 2 - Version: 138 + Version: 139 This document summarizes Apocalypse 2, which covers small-scale lexical items and typological issues. (These Synopses also contain @@ -1096,8 +1096,8 @@ # Anything assigned to the variable $mitsy must conform # to the type Fish and either the Cat or Dog type... - my Cat|Dog Fish $mitsy = new Fish but { int rand 2 ?? .does Cat - !! .does Dog }; + my Cat|Dog Fish $mitsy = new Fish but { Bool.pick ?? .does Cat + !! .does Dog }; =head2 Parameter types Modified: doc/trunk/design/syn/S04.pod ============================================================================== --- doc/trunk/design/syn/S04.pod (original) +++ doc/trunk/design/syn/S04.pod Tue Oct 14 17:14:18 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 19 Aug 2004 - Last Modified: 1 Sep 2008 + Last Modified: 14 Oct 2008 Number: 4 - Version: 69 + Version: 70 This document summarizes Apocalypse 4, which covers the block and statement syntax of Perl. @@ -1080,11 +1080,11 @@ } parentheses aren't necessary around C<EXPR> because the whitespace -between C<EXPR> and the block forces the block to be considered a -block rather than a subscript. This works for all control structures, -not just the new ones in Perl 6. A top-level bare block -is always considered a statement block if there's space -before it: +between C<EXPR> and the block forces the block to be considered a block +rather than a subscript, provided the block occurs where an infix +operator would be expected. This works for all control structures, +not just the new ones in Perl 6. A top-level bare block is always +considered a statement block if there's a term and a space before it: if $foo { ... } elsif $bar { ... } @@ -1094,30 +1094,24 @@ You can still parenthesize the expression argument for old times' sake, as long as there's a space between the closing paren and the -opening brace. You I<must> parenthesize the expression if there is -a bare block or pointy block that would be misinterpreted as the statement's -block. This is regardless of whether a term or operator is expected where -the block occurs. (A block inside brackets, or used as a -postcircumfix is fine, though.) Any block with whitespace -in front of it will be taken as terminating the conditional, even if -the conditional expression could take another argument. Therefore - - if rand { say "exists" } { extra() } - if rand -> $x { say "exists" } { extra() } - -is always parsed as - - if (rand) { say "exists" }; { extra() } - if (rand) -> $x { say "exists" }; { extra() } - -rather than - - if (rand { say "exists" }) { extra() } - if (rand (-> $x { say "exists" })) { extra() } - -Apart from that, it is illegal to use a bare closure where an -operator is expected. (Remove the whitespace if you wish it to be -a postcircumfix.) +opening brace. (Otherwise it will be parsed as a hash subscript.) + +Note that the parser cannot intuit how many arguments a list operator +is taking, so if you mean 0 arguments, you must parenthesize the +argument list to force the block to appear after a term: + + if caller {...} # WRONG, parsed as caller({...}) + if caller() {...} # okay + if (caller) {...} # okay + +Note that common idioms work as expected though: + + for map { $^a + 1 }, @list { .say } + +Unless you are parsing a statement that expects a block argument, +it is illegal to use a bare closure where an operator is expected +because it will be considered to be two terms in row. +(Remove the whitespace if you wish it to be a postcircumfix.) Anywhere a term is expected, a block is taken to be a closure definition (an anonymous subroutine). If the closure is empty, or appears to contain Modified: doc/trunk/design/syn/S06.pod ============================================================================== --- doc/trunk/design/syn/S06.pod (original) +++ doc/trunk/design/syn/S06.pod Tue Oct 14 17:14:18 2008 @@ -13,9 +13,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 21 Mar 2003 - Last Modified: 11 Oct 2008 + Last Modified: 14 Oct 2008 Number: 6 - Version: 95 + Version: 96 This document summarizes Apocalypse 6, which covers subroutines and the @@ -713,10 +713,8 @@ undefined is not considered to be missing, and hence does not trigger the default. Use C<//=> within the body for that.) -(Conjectural: Within the body you may also use C<exists> on the -parameter name to determine whether it was passed. Maybe this will have to -be restricted to the C<?> form, unless we're willing to admit that a parameter -could be simultaneously defined and non-existent.) +You may check whether an optional parameter was bound to anything +by calling C<VAR($param).defined>. =head2 Named parameters @@ -1356,39 +1354,9 @@ sub quicksort (:$reverse, :$inplace, *$pivot, [EMAIL PROTECTED]) -=head2 Unpacking hash parameters - -Likewise, a hash argument can be mapped to a hash of parameters, specified -as named parameters within curlies. Instead of saying: - - sub register (%guest_data, $room_num) { - my $name := delete %guest_data<name>; - my $addr := delete %guest_data<addr>; - ... - } - -you can get the same effect with: - - sub register ({:$name, :$addr, *%guest_data}, $room_num) { - ... - } - -Use of the curly form is not allowed where it might be confused with the -following block's opening curly: - - -> {:$name, :$addr, *%guest_data}, $room_num { # WRONG - -However, as described in the next section, you can always use a -sub-signature instead: - - -> (:$name, :$addr, *%guest_data), $room_num { # note ()'s - -In fact, the [...] and {...} forms are really just extra documentation -about what you expect. - =head2 Unpacking tree node parameters -You can unpack tree nodes in various dwimmy ways by enclosing the bindings +You can unpack hash values and tree nodes in various dwimmy ways by enclosing the bindings of child nodes and attributes in parentheses following the declaration of the node itself: Modified: doc/trunk/design/syn/S09.pod ============================================================================== --- doc/trunk/design/syn/S09.pod (original) +++ doc/trunk/design/syn/S09.pod Tue Oct 14 17:14:18 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 13 Sep 2004 - Last Modified: 17 July 2008 + Last Modified: 14 Oct 2008 Number: 9 - Version: 28 + Version: 29 =head1 Overview @@ -362,7 +362,7 @@ @@x <== %hash.keys.grep: {/^\d+$/}; @@x <== =<>; @@x <== 1..*; - @@x <== gather { loop { take rand 100 } }; + @@x <== gather { loop { take 100.rand } }; @array{@@x} @@ -374,7 +374,7 @@ @x <== %hash.keys.grep: {/^\d+$/}; @x <== =<>; @x <== 1..*; - @x <== gather { loop { take rand 100 } }; + @x <== gather { loop { take 100.rand } }; @array{@@x} # multidimensional @[EMAIL PROTECTED] # flattened @@ -1206,7 +1206,7 @@ In Perl 6 these read-only operations are indeed non-destructive: my %hash; - exists %hash<foo><bar>; # %hash is still empty + %hash<foo><bar> :exists; # %hash is still empty But these bindings I<do> autovivify: Modified: doc/trunk/design/syn/S12.pod ============================================================================== --- doc/trunk/design/syn/S12.pod (original) +++ doc/trunk/design/syn/S12.pod Tue Oct 14 17:14:18 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 27 Oct 2004 - Last Modified: 21 Aug 2008 + Last Modified: 14 Oct 2008 Number: 12 - Version: 63 + Version: 64 =head1 Overview @@ -1787,6 +1787,26 @@ type C<bit>. Never compare a value to "C<true>", or even "C<True>". Just use it in a boolean context. +Enum types (and perhaps certain other finite, enumerable types such +as finite ranges) define a C<.pick> method on the protoobject of +that type. Hence: + + my enum CoinFace <Heads Tails>; + CoinFace.pick + +returns C<Heads> or C<Tails> with equal probability, and + + Month.pick(*) + +will return the months in random order. Presumably + + StandardPlayingCards.pick(5) + +might return a Royal Flush, but a Full House is much +more likely. It can never return Five Aces, since the pick +is done without replacement. (If it I<does> return Five Aces, +it's time to walk away.) + =head1 Open vs Closed Classes By default, all classes in Perl are non-final, which means