Author: larry
Date: Wed Jun 11 14:09:40 2008
New Revision: 14547

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

Log:
change most left-associative short-circuit ops to list-associative
x and xx are now left associative
define what associativity means for unary ops


Modified: doc/trunk/design/syn/S03.pod
==============================================================================
--- doc/trunk/design/syn/S03.pod        (original)
+++ doc/trunk/design/syn/S03.pod        Wed Jun 11 14:09:40 2008
@@ -12,9 +12,9 @@
 
   Maintainer: Larry Wall <[EMAIL PROTECTED]>
   Date: 8 Mar 2004
-  Last Modified: 2 Apr 2008
+  Last Modified: 11 Jun 2008
   Number: 3
-  Version: 135
+  Version: 136
 
 =head1 Overview
 
@@ -36,36 +36,46 @@
     L  Symbolic unary    ! + - ~ ? | +^ ~^ ?^ \ ^ =
     L  Multiplicative    * / % +& +< +> ~& ~< ~> ?& div mod
     L  Additive          + - +| +^ ~| ~^ ?| ?^
-    N  Replication       x xx
-    L  Concatenation     ~
+    L  Replication       x xx
+    X  Concatenation     ~
     X  Junctive and      &
     X  Junctive or       | ^
     L  Named unary       sleep abs sin
     N  Nonchaining infix but does <=> leg cmp .. ..^ ^.. ^..^
     C  Chaining infix    != == < <= > >= eq ne lt le gt ge ~~ === eqv !eqv
-    L  Tight and         &&
-    L  Tight or          || ^^ // min max
+    X  Tight and         &&
+    X  Tight or          || ^^ // min max
     L  Conditional       ?? !! ff fff
     R  Item assignment   = := ::= => += -= **= xx= .=
     L  Loose unary       true not
     X  Comma operator    , p5=>
     X  List infix        Z minmax X X~X X*X XeqvX
     R  List prefix       : print push say die map substr ... [+] [*] any $ @
-    L  Loose and         and andthen
-    L  Loose or          or xor orelse
+    X  Loose and         and andthen
+    X  Loose or          or xor orelse
     N  Terminator        ; <==, ==>, <<==, ==>>, {...}, unless, extra ), ], }
 
-The associativities specified above are:
+Using two C<!> symbols below generically to represent any pair of operators
+that have the same precedence, the associativities specified above
+for binary operators are interpreted as follows:
 
-        Assoc     Meaning of $a op $b op $c
+        Assoc     Meaning of $a ! $b ! $c
         =====     =========================
-    L   left      ($a op $b) op $c
-    R   right     $a op ($b op $c)
+    L   left      ($a ! $b) ! $c
+    R   right     $a ! ($b ! $c)
     N   non       ILLEGAL
-    C   chain     ($a op $b) and ($b op $c)
-    X   list      op($a, $b, $c) or op($a; $b; $c)
+    C   chain     ($a ! $b) and ($b ! $c)
+    X   list      infix:<!>($a; $b; $c)
 
-Note that list associativity only works between identical operators.
+For unaries this is interpreted as:
+
+        Assoc     Meaning of !$a!
+        =====     =========================
+    L   left      (!$a)!
+    R   right     !($a!)
+    N   non       ILLEGAL
+
+Note that list associativity (X) only works between identical operators.
 If two different list-associative operators have the same precedence,
 they are assumed to be left-associative with respect to each other.
 For example, the C<X> cross operator and the C<Z> zip operator both
@@ -77,6 +87,9 @@
 
     (@a X @b) Z @c
 
+Similarly, if the only implementation of a list-associative operator
+is binary, it will be treated as left associative.
+
 If you don't see your favorite operator above, the following
 sections cover all the operators in precedence order.  Basic operator
 descriptions are here; special topics are covered afterwards.
@@ -659,7 +672,7 @@
 
     ^$limit
 
-Constructs a range of C<0..^$limit> or locates a metaclass as a shortcut
+Constructs a range of C<0 ..^ $limit> or locates a metaclass as a shortcut
 for C<$limit.HOW>.  See L</Range semantics>.
 
 =item *
@@ -932,7 +945,7 @@
 
 C<< infix:<&> >>, all() operator
 
-    $x & $y
+    $a & $b & $c ...
 
 =back
 
@@ -944,13 +957,13 @@
 
 C<< infix:<|> >>, any() operator
 
-    $x | $y
+    $a | $b | $c ...
 
 =item *
 
 C<< infix:<^> >>, one() operator
 
-    $x ^ $y
+    $a ^ $b ^ $c ...
 
 =back
 
@@ -1042,6 +1055,11 @@
 Constructs Range objects, optionally excluding one or both endpoints.
 See L</Range semantics>.
 
+Note that these differ:
+
+    $min ..^ $max      $ min .. $max-1
+    $min .. ^$max      # $min .. (0..$max-1)
+
 =back
 
 =head2 Chaining binary precedence
@@ -1145,10 +1163,10 @@
 
 C<< infix:<&&> >>, short-circuit and
 
-    $condition && $whentrue
+    $a && $b && $c ...
 
-Returns the left argument if the left argument is false, otherwise
-evaluates and returns the right argument.  In list context forces
+Returns the first argument that evaluates to false, otherwise
+returns the result of the last argument.  In list context forces
 a false return to mean C<()>.  See C<and> below for low-precedence
 version.
 
@@ -1160,13 +1178,14 @@
 
 =item *
 
-C<< infix:<||> >>, short-circuiting inclusive-or
+C<< infix:<||> >>, short-circuit inclusive-or
 
-    $condition || $whenfalse
+    $a || $b || $c ...
 
-Returns the left argument if it's true, otherwise evaluates and returns
-the right argument.  It is specifically allowed to use a list or array
-both as a boolean and as a list value produced if the boolean is true:
+Returns the first argument that evaluates to a true value, otherwise
+returns the result of the last argument.  It is specifically allowed
+to use a list or array both as a boolean and as a list value produced
+if the boolean is true:
 
     @a = @b || @c;              # broken in Perl 5; works in Perl 6
 
@@ -1175,35 +1194,37 @@
 
 =item *
 
-C<< infix:<^^> >>, exclusive-or
+C<< infix:<^^> >>, short-circuit exclusive-or
 
-    $x ^^ $y
+    $a ^^ $b ^^ $c ...
 
 Returns the true argument if there is one (and only one).  Returns
-C<Bool::False> if both arguments are false or both arguments are true.
-In list context forces a false return to mean C<()>.
+C<Bool::False> if all arguments are false or if more than one argument
+is true.  In list context forces a false return to mean C<()>.
 See C<xor> below for low-precedence version.
 
+Similar to the C<[^^]> reduce operator, but short-circuits in the sense
+that it does not evaluate any arguments after a 2nd true result.
+
 =item *
 
-C<< infix:<//> >>, default operator
+C<< infix:<//> >>, short-circuit default operator
 
-    $value // $default
+    $a // $b // $c ...
 
-Returns the left argument if it's defined, otherwise evaluates and
-returns the right argument.  In list context forces a false return
-to mean C<()>.  See C<orelse> below for a similar but not identical
-low-precedence version.
+Returns the first argument that evaluates to a defined value, otherwise
+returns the result of the last argument.  In list context forces a
+false return to mean C<()>.  See C<orelse> below for a similar but
+not identical low-precedence version.
 
 =item *
 
 Minimum and maximum
 
-    $min0 min $min1
-    $max0 max $max1
+    $a min $b min $c ...
+    $a max $b max $c ...
 
-Instead of deciding whether to return the left or right based on booleans
-or definedness, these return the minimum or maximum value.  See also the
+These return the minimum or maximum value.  See also the
 C<minmax> listop.
 
 Not all types can support the concept of infinity.  Therefore any
@@ -1774,10 +1795,10 @@
 
 C<< infix:<and> >>, short-circuit and
 
-    $condition and $whentrue
+    $a and $b and $c ...
 
-Returns the left argument if the left argument is false, otherwise
-evaluates and returns the right argument.  In list context forces
+Returns the first argument that evaluates to false, otherwise
+returns the result of the last argument.  In list context forces
 a false return to mean C<()>.  See C<&&> above for high-precedence
 version.
 
@@ -1785,9 +1806,9 @@
 
 C<< infix:<andthen> >>, proceed on success
 
-    test1() andthen test2()
+    test1() andthen test2() andthen test3() ...
 
-Returns the left argument if the left argument indicates failure
+Returns the first argument whose evaluation indicates failure
 (that is, if the result is undefined).  Otherwise it
 evaluates and returns the right argument.
 
@@ -1815,20 +1836,20 @@
 
 C<< infix:<or> >>, short-circuit inclusive or
 
-    $condition or $whenfalse
+    $a or $b or $c ...
 
-Returns the left argument if it's true, otherwise evaluates and
-returns the right argument.  In list context forces a false return
+Returns the first argument that evaluates to true, otherwise returns
+the result of the last argument.  In list context forces a false return
 to mean C<()>.  See C<||> above for high-precedence version.
 
 =item *
 
 C<< infix:<xor> >>, exclusive or
 
-    $x xor $y
+    $a xor $b xor $c ...
 
 Returns the true argument if there is one (and only one).  Returns
-C<Bool::False> if both arguments are false or both arguments are true.
+C<Bool::False> if all arguments are false or if more than one argument is true.
 In list context forces a false return to mean C<()>.
 See C<^^> above for high-precedence version.
 
@@ -1836,11 +1857,11 @@
 
 C<< infix:<orelse> >>, proceed on failure
 
-    test1() orelse test2()
+    test1() orelse test2() orelse test3() ...
 
-Returns the left argument if the left argument indicates success
-(that is, if the result is defined).  Otherwise it evaluates and
-returns the right argument.
+Returns the first argument that evaluates successfully (that is,
+if the result is defined).  Otherwise returns the result of the
+right argument.
 
 If the right side is a block or pointy block, the result of the left
 side is bound to any arguments of the block.  If the right side is

Reply via email to