Author: larry
Date: Tue Sep 12 11:07:01 2006
New Revision: 11969

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

Log:
New X operator and metaoperator.


Modified: doc/trunk/design/syn/S03.pod
==============================================================================
--- doc/trunk/design/syn/S03.pod        (original)
+++ doc/trunk/design/syn/S03.pod        Tue Sep 12 11:07:01 2006
@@ -14,7 +14,7 @@
   Date: 8 Mar 2004
   Last Modified: 12 Sep 2006
   Number: 3
-  Version: 58
+  Version: 59
 
 =head1 Changes to Perl 5 operators
 
@@ -639,7 +639,7 @@
 operators yourself.  Similarly, the carets that exclude the endpoints
 on ranges are there by convention only.
 
-In contrast to that, Perl 6 has four standard metaoperators for
+In contrast to that, Perl 6 has five standard metaoperators for
 turning a given existing operator into a related operator that is
 more powerful (or at least differently powerful).  These differ from a
 mere naming convention in that Perl automatically generates these new
@@ -801,7 +801,7 @@
 
 =head2 Reduction operators
 
-The final metaoperator in Perl 6 is the reduction operator.  Any
+The fourth metaoperator in Perl 6 is the reduction operator.  Any
 infix operator (except for non-associating operators)
 can be surrounded by square brackets in term position to
 create a list operator that reduces using that operation:
@@ -1025,6 +1025,52 @@
 mean the normal reduction of C<< infix:<\x> >> operator, not the triangular
 reduction of C<< infix:<x> >>.  This is deemed to be an insignificant problem.
 
+=head1 Cross operators
+
+The final metaoperator is the C<X> metaoperator.  It applies the
+modified operator across all permutations of its list arguments.  All
+C<X> operators are of list infix precedence, and are list associative.
+
+The bare form of C<X> is considered an operator in its own right.
+Saying:
+
+    <a b> X 1,2 X <x y>
+
+produces
+
+    ['a', 1, 'x'],
+    ['a', 1, 'y'],
+    ['a', 2, 'x'],
+    ['a', 2, 'y'],
+    ['b', 1, 'x'],
+    ['b', 1, 'y'],
+    ['b', 2, 'x'],
+    ['b', 2, 'y']
+
+The string concatenating form is:
+
+    <a b> X~ <1 2>           #  'a1', 'a2', 'b1', 'b2'
+
+As a metaoperator, C<X~> operator desugars to something like:
+
+    [~]«( <a b> X <1 2> )  #  'a1', 'a2', 'b1', 'b2'
+
+Any existing, non-mutating infix operator may be used after the C<X>.
+
+    1,2 X* 3,4               # 3,4,6,8
+
+(Note that C<< <== >> and C<< ==> >> are considered mutating, as well as
+all assignment operators.)
+
+If the underlying operator is non-associating, so is the metaoperator:
+
+    @a Xcmp @b Xcmp @c       # ILLEGAL
+    @a Xeq @b Xeq @c         # ok
+
+Unlike bare C<X>, the C<X,> form flattens much like C<[,]> does.
+
+    <a b> X, <1 2>         # 'a', '1', 'a', '2', 'b', '1', 'b', '2'
+
 =head1 Junctive operators
 
 C<|>, C<&>, and C<^> are no longer bitwise operators (see
@@ -1401,6 +1447,18 @@
 
     @foo := [[1,2,3],[4,5,6]]; say cat([;] @foo); # 1,2,3,4,5,6
 
+=head1 Crossing arrays
+
+In contrast to the zip operator, the C<X> operator returns all the
+permutations of its sublists.  Hence you may say:
+
+    <a b> X <1 2>
+
+and you end up with
+
+    ['a', '1'], ['a', '2'], ['b', '1'], ['b', '2']
+
+It is really a variant of the C<X> metaoperator mentioned earlier.
 =head1 Minimal whitespace DWIMmery
 
 Whitespace is no longer allowed before the opening bracket of an array
@@ -1481,7 +1539,7 @@
                            !!! ...  ???
                            [+] [*] [<] [,] [\+] [\*] etc.
                            (also = as list assignment)
-    list infix          ¥ <== ==>
+    list infix          ¥ <== ==> X X~ X* Xeqv etc.
     loose and           and
     loose or            or xor err
     expr terminator     ; {} as control block, statement modifiers

Reply via email to