# New Ticket Created by  Allison Randal 
# Please include the string:  [perl #24559]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=24559 >


This patch updates vector operators (from ^+ to >>+<<) and the XOR
operator (from ~~ to ^^) to match the current design.  I still have a
few more tweaks I want to make (especially to how vector ops are
parsed), and a pile of other operator changes to make, but this was a
nice stopping point.

The two regex tests are still failing (I may have to fix those just so
they stop annoying me), but otherwise all the tests pass.

Allison


-- attachment  1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/67828/50484/f0bc7c/p6c_update_vector_ops.patch

Index: languages/perl6/perl6
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/perl6,v
retrieving revision 1.37
diff -u -r1.37 perl6
--- languages/perl6/perl6       31 Oct 2003 11:08:18 -0000      1.37
+++ languages/perl6/perl6       26 Nov 2003 23:29:01 -0000
@@ -77,7 +77,7 @@
     -h|--help        Print this message and exit
     --help-(imcc|parrot|test|parser|global|output)
                      Print detailed help for one subpart
-    -v|--verbose     Print mesages about compile stages (repeat for
+    -v|--verbose     Print messages about compile stages (repeat for
                          more verbosity)
     -V|--version     Print versions and exit
     -w|--warnings    Print warnings (repeat for more warnings)
Index: languages/perl6/P6C/Addcontext.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/Addcontext.pm,v
retrieving revision 1.20
diff -u -r1.20 Addcontext.pm
--- languages/perl6/P6C/Addcontext.pm   13 Oct 2003 17:00:40 -0000      1.20
+++ languages/perl6/P6C/Addcontext.pm   26 Nov 2003 23:29:05 -0000
@@ -52,7 +52,7 @@
         # propagate values in their surrounding context (even though
         # they may evaluate in boolean context?).  So we can't quite
         # do this:
-#       bool => [ qw(&& ~~ ||) ],
+#       bool => [ qw(&& ^^ ||) ],
        );
 
     while (my ($t, $ops) = each %opmap) {
@@ -91,6 +91,7 @@
     my ($x, $ctx) = @_;
     my $op = $x->op;
 
+    # Checking for stray assignment operators: "+=" or ">>+=<<".
     if ((ref($op) && $op->isa('P6C::hype') && $op->op =~ /^([^=]+)=$/)
        || $op =~ /^([^=]+)=$/) {
        # Turn this into a normal, non-inplace operator and try again.
Index: languages/perl6/P6C/IMCC.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/IMCC.pm,v
retrieving revision 1.29
diff -u -r1.29 IMCC.pm
--- languages/perl6/P6C/IMCC.pm 3 Nov 2003 15:05:17 -0000       1.29
+++ languages/perl6/P6C/IMCC.pm 26 Nov 2003 23:29:08 -0000
@@ -1347,7 +1347,7 @@
     my $ltmp = $x->l->val;
     my $rtmp = $x->r->val;
     my $dest = newtmp 'PerlUndef';
-    my $op = $x->op;
+    my $op = imcc_op($x->op);
     code("\t$dest = $ltmp $op $rtmp\n");
     return $dest;
 }
@@ -1401,7 +1401,7 @@
  '='   => \&do_assign,
  '||'  => \&do_logor,
  '&&'  => \&do_logand,
- '~~'  => \&simple_binary,
+ '^^'  => \&simple_binary,
  '//'  => \&do_defined,
  ','   => \&do_array,
  'x'   => \&do_repeat,
@@ -1413,39 +1413,41 @@
 
 use vars '%op_is_array';
 BEGIN {
-    my @arrayops = qw(= .. x // ~~ && || _);
+    my @arrayops = qw(= .. x // ^^ && || _);
     push(@arrayops, ',');
     @[EMAIL PROTECTED] = (1) x @arrayops;
 }
 
 sub val {
     my $x = shift;
+
     if (ref($x->op) eq 'P6C::hype') {
+       check_assign_op($x->op->op);
        return do_hyped($x->op->op, $x->l, $x->r);
     }
+
     my $ret;
     my $op = $x->op;
     if ($ops{$op}) {
        $ret = $ops{$op}->($x);
-    } elsif($op =~ /^([^=]+)=$/ && $ops{$1}) {
-       # XXX:
-       die "Internal error -- assignment op `$op' snuck into IMCC.pm";
-
-       # Translate assignment operation into a binary operation.
-       # XXX: Context propagation is broken for these, so we won't
-       # ever do this.
-       $op = $1;
-       $ret = $ops{'='}->(new P6C::Binop op => '=', l => $x->l,
-                          r => P6C::Binop->new(op => $op, l => $x->l,
-                                               r => $x->r));
     } else {
-       unimp $op;
+       check_assign_op($op);
+       unimp "Unimplemented operator $op";
     }
 
     if (!$op_is_array{$op}) {
        return scalar_in_context($ret, $x->{ctx});
     }
     return $ret;
+}
+
+sub check_assign_op {
+    my $op = shift;
+    if($op =~ /^([^=]+)=$/ && $ops{$1}) {
+        # XXX: This should probably be checked at an earler stage.
+        die "Internal error -- assignment op `$op' snuck into IMCC.pm";
+    }
+    return 1;
 }
 
 ######################################################################
Index: languages/perl6/P6C/Parser.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/Parser.pm,v
retrieving revision 1.27
diff -u -r1.27 Parser.pm
--- languages/perl6/P6C/Parser.pm       13 Oct 2003 17:00:41 -0000      1.27
+++ languages/perl6/P6C/Parser.pm       26 Nov 2003 23:29:09 -0000
@@ -229,7 +229,8 @@
     use vars '$err_handler';
     use vars qw(%KEYWORDS %CLASSES %WANT);
     use vars qw($NAMEPART $COMPARE $CONTEXT $MULDIV $PREFIX $ADDSUB $INCR
-               $LOG_OR $LOGOR $FILETEST $ASSIGN $HYPE $MATCH $BITSHIFT
+               $LOG_OR $LOGOR $FILETEST $ASSIGN $VOPEN $VCLOSE $MATCH 
+               $BITSHIFT $BITOR $BITAND
                $SOB $FLUSH $NUMPART $NUMBER $RXATOM $RXMETA $RXCHARCLASS
                $SPECIAL_DELIM
                $RXESCAPED $HEXCHAR $RXASSERTION);
@@ -246,7 +247,8 @@
 # Regexen used in the parser:
 BEGIN {
     $SOB       = qr|$Parse::RecDescent::skip(?<![^\n\s]){|o;
-    $HYPE      = qr/\^?/;
+    $VOPEN     = qr/>>/;
+    $VCLOSE    = qr/<</;
     $NAMEPART  = qr/[a-zA-Z_][\w_]*/;
     $COMPARE   = qr{(?:cmp|eq|[gnl]e|[gl]t)\b|<=>|[<>=!]=|<|>};
     $CONTEXT   = [EMAIL PROTECTED]&*_?]|\+(?!\+)};
@@ -260,9 +262,11 @@
     $ADDSUB    = qr{[-+_]};
     $BITSHIFT  = qr{<<|>>};
     $LOG_OR    = qr{(?:x?or|err)\b};
-    $LOGOR     = qr{\|\||~~|//};
+    $LOGOR     = qr{\|\||\^\^|//};
+    $BITOR     = qr{(?:\|(?!\|)|~(?!~))};
+    $BITAND    = qr{&(?!&)};
     $FILETEST  = qr{-[rwxoRWXOezsfdlpSbctugkTBMAC]+\b};
-    $ASSIGN    = qr{(?:!|:|//|&&?|\|\|?|~~?|<<|>>|$ADDSUB|$MULDIV|\*\*)?=};
+    $ASSIGN    = qr{(?:!|:|//|&&?|\|\|?|~|\^\^|<<|>>|$ADDSUB|$MULDIV|\*\*)?=};
     # Used for flushing syntax errors
     $FLUSH     = qr/\w+|[^\s\w;}#'"]+/;
     $NUMPART   = qr/(?!_)[\d_]+(?<!_)/;
@@ -488,14 +492,14 @@
                | subscript(s)
 
 apply:           <leftop: term apply_op apply_rhs>
-apply_op:        /$HYPE\./o
+apply_op:        /\.|$VOPEN\.$VCLOSE/o
 
 incr:            incr_op <commit> apply
                | apply incr_op(?)
-incr_op:         /$HYPE$INCR/o
+incr_op:         /$INCR|$VOPEN$INCR$VCLOSE/o
 
 pow:             <leftop: incr pow_op prefix>
-pow_op:                  /$HYPE\*\*/o
+pow_op:                  /\*\*|$VOPEN\*\*$VCLOSE/o
 
 prefix:                  filetest_op <commit> prefix
                | prefix_op <commit> prefix
@@ -503,7 +507,7 @@
                | pow
 
 # prefix_op:     '!' | '~' | '\\' | /-(?![->])/
-prefix_op:       /$HYPE$PREFIX/o
+prefix_op:       /$PREFIX|$VOPEN$PREFIX$VCLOSE/o
 filetest_op:     /$FILETEST/o
 
 pair:            namepart '=>' <commit> prefix
@@ -512,36 +516,36 @@
                | prefix ('=>' prefix)(?)
 
 match:           <leftop: maybe_pair match_op maybe_pair>
-match_op:        /$HYPE$MATCH/o
+match_op:        /$MATCH|$VOPEN$MATCH$VCLOSE/o
 
 muldiv:                  <leftop: match muldiv_op match>
 # muldiv_op:     '*' | '/' | '%' | 'x'
-muldiv_op:       /$HYPE$MULDIV/o
+muldiv_op:       /$MULDIV|$VOPEN$MULDIV$VCLOSE/o
 
 addsub:                  <leftop: muldiv addsub_op muldiv>
 # addsub_op:     '+' | '-' | '_'
-addsub_op:       /$HYPE$ADDSUB/o
+addsub_op:       /$ADDSUB|$VOPEN$ADDSUB$VCLOSE/o
 
 bitshift:        <leftop: addsub bitshift_op addsub>
-bitshift_op:     /$HYPE$BITSHIFT/o
+bitshift_op:     /$BITSHIFT|$VOPEN$BITSHIFT$VCLOSE/o
 
 compare:         <leftop: bitshift compare_op bitshift>
-compare_op:      /$HYPE$COMPARE/o
+compare_op:      /$COMPARE|$VOPEN$COMPARE$VCLOSE/o
 # compare_op:    '<=>' | '<=' | '==' | '>=' | '<' | '>' | '!='
 #              | 'eq' | 'ge' | 'ne' | 'le' | 'lt' | 'gt' | 'cmp'
 
 bitand:                  <leftop: compare bitand_op compare>
-bitand_op:       /$HYPE&(?!&)/o
+bitand_op:       /$BITAND|$VOPEN$BITAND$VCLOSE/o
 
 bitor:           <leftop: bitand bitor_op bitand>
-bitor_op:        /$HYPE(?:\|(?!\|)|~(?!~))/o
+bitor_op:        /$BITOR|$VOPEN$BITOR$VCLOSE/o
 
 logand:                  <leftop: bitor logand_op bitor>
-logand_op:       /$HYPE&&/o
+logand_op:       /&&|$VOPEN&&$VCLOSE/o
 
 logor:           <leftop: logand logor_op logand>
-# logor_op:      '||' | '~~' | '//'
-logor_op:        /$HYPE$LOGOR/o
+# logor_op:      '||' | '^^' | '//'
+logor_op:        /$LOGOR|$VOPEN$LOGOR$VCLOSE/o
 
 range:           logor (range_op logor)(?)
 range_op:        '..'
@@ -571,7 +575,7 @@
                | ternary
 assign_rhs:      assign_op scalar_expr
 
-assign_op:       /$HYPE$ASSIGN/o
+assign_op:       /$ASSIGN|$VOPEN$ASSIGN$VCLOSE/o
 # assign_op:     /[!:]?=/ <commit>
 #              | assignable_op <skip:''> '='
 # assignable_op:         '//'
@@ -595,11 +599,11 @@
 adv_clause:      /:(?!:)/ comma['scalar_expr']
 
 log_AND:         <leftop: adverb log_AND_op adverb>
-log_AND_op:      /${HYPE}and\b/o
+log_AND_op:      /and\b|${VOPEN}and\b$VCLOSE/o
 
 log_OR:                  <leftop: log_AND log_OR_op log_AND>
 # log_OR_op:     'or' | 'xor' | 'err'
-log_OR_op:       /$HYPE$LOG_OR/o
+log_OR_op:       /$LOG_OR|$VOPEN$LOG_OR$VCLOSE/o
 
 expr:            log_OR
 
Index: languages/perl6/P6C/Tree.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/Tree.pm,v
retrieving revision 1.24
diff -u -r1.24 Tree.pm
--- languages/perl6/P6C/Tree.pm 13 Oct 2003 17:00:41 -0000      1.24
+++ languages/perl6/P6C/Tree.pm 26 Nov 2003 23:29:11 -0000
@@ -124,7 +124,7 @@
 # Having a separate rule for hyping is too expensive.
 sub operator_tree {
     local $_ = shift->[1];
-    if (/^\^(.+)/) {
+    if (/^>>(.+)<</) {
        return new P6C::hype op => $1;
     }
     return $_;
Index: languages/perl6/P6C/IMCC/Binop.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/IMCC/Binop.pm,v
retrieving revision 1.13
diff -u -r1.13 Binop.pm
--- languages/perl6/P6C/IMCC/Binop.pm   12 Sep 2002 14:34:42 -0000      1.13
+++ languages/perl6/P6C/IMCC/Binop.pm   26 Nov 2003 23:29:12 -0000
@@ -10,7 +10,7 @@
 use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK);
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(do_pow do_logand do_logor do_defined do_concat do_repeat
-               do_range do_smartmatch);
+               do_range do_smartmatch imcc_op);
 %EXPORT_TAGS = (all => [EMAIL PROTECTED]);
 
 sub do_pow ;
@@ -27,6 +27,16 @@
 sub sm_hash_scalar ;
 sub sm_expr_num ;
 sub sm_expr_str ;
+
+# Remap operator names from P6 to IMCC.
+sub imcc_op {
+       my $op = shift;
+
+       return "~~" if ($op eq '^^');
+       return "." if ($op eq '_');
+
+       return $op;
+}
 
 1;
 
Index: languages/perl6/P6C/IMCC/hype.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/IMCC/hype.pm,v
retrieving revision 1.4
diff -u -r1.4 hype.pm
--- languages/perl6/P6C/IMCC/hype.pm    26 Sep 2002 13:38:21 -0000      1.4
+++ languages/perl6/P6C/IMCC/hype.pm    26 Nov 2003 23:29:12 -0000
@@ -9,6 +9,7 @@
 package P6C::IMCC::hype;
 use SelfLoader;
 use P6C::IMCC ':all';
+use P6C::IMCC::Binop 'imcc_op';
 use P6C::Util qw(diag is_array_expr unimp);
 require Exporter;
 use vars qw(@ISA @EXPORT_OK);
@@ -20,7 +21,7 @@
 
 use vars '%optype';
 BEGIN {
-    my %opmap = (int => [ qw(>> << | & ~ ~~)],
+    my %opmap = (int => [ qw(>> << | & ~ ^^)],
                 num => [ qw(+ - * / % **)],
                 str => [ qw(_) ]);
     while (my ($t, $ops) = each %opmap) {
@@ -50,11 +51,12 @@
 sub simple_hyped {
     my ($op, $targ, $lindex, $rindex) = @_;
     my $optype = $optype{$op} or unimp "Can't hype $op yet";
-    $op = '.' if $op eq '_';   # XXX: should handle this elsewhere.
+    $op = imcc_op($op);        # XXX: should handle this elsewhere.
     my $ltmp = gentmp $optype;
     my $rtmp = gentmp $optype;
     my $dest = gentmp $optype;
     return <<END;
+       # simple_hyped $op
        $ltmp = $lindex
        $rtmp = $rindex
        $dest = $ltmp $op $rtmp
@@ -118,11 +120,11 @@
        return hype_scalar_array(@_);
     } else {
        diag "Tried to hyper-operate two scalars";
-       return simple_binary(@_);
+       return P6C::Binop::simple_binary(@_);
     }
 }
 
-# @xs ^op $y
+# @xs >>op<< $y
 sub hype_array_scalar {
     my ($op, $l, $r) = @_;
     my $lval = $l->val;
@@ -141,7 +143,7 @@
     return $op->{ctx} ? array_in_context($dest, $op->{ctx}) : $dest;
 }
 
-# $x ^op @ys
+# $x >>op<< @ys
 sub hype_scalar_array {
     my ($op, $l, $r) = @_;
     my $lval = $l->val;
@@ -160,7 +162,7 @@
     return $op->{ctx} ? array_in_context($dest, $op->{ctx}) : $dest;
 }
 
-# @xs ^op @ys
+# @xs >>op<< @ys
 #
 # Currently iterates over the number of elements in the _shorter_ of
 # the two arrays, rather than the longer.  This is useful for working
Index: languages/perl6/t/compiler/basic.t
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/compiler/basic.t,v
retrieving revision 1.1
diff -u -r1.1 basic.t
--- languages/perl6/t/compiler/basic.t  13 Oct 2003 17:00:57 -0000      1.1
+++ languages/perl6/t/compiler/basic.t  26 Nov 2003 23:29:12 -0000
@@ -133,10 +133,10 @@
     print1(2 && 0);
     print1(0 && 2);
     print1(0 && 0);
-    print1(2 ~~ 3);
-    print1(2 ~~ 0);
-    print1(0 ~~ 2);
-    print1(0 ~~ 0);
+    print1(2 ^^ 3);
+    print1(2 ^^ 0);
+    print1(0 ^^ 2);
+    print1(0 ^^ 0);
     my $x;
     print1($x // 0);
     print1(0  // $x);
@@ -154,8 +154,8 @@
 
 
 0
-1
-1
+2
+2
 0
 0
 0
Index: languages/perl6/t/compiler/globals.t
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/compiler/globals.t,v
retrieving revision 1.1
diff -u -r1.1 globals.t
--- languages/perl6/t/compiler/globals.t        13 Oct 2003 17:00:57 -0000      1.1
+++ languages/perl6/t/compiler/globals.t        26 Nov 2003 23:29:12 -0000
@@ -6,7 +6,7 @@
 ##############################
 output_is(<<'CODE', <<'OUT', "globals");
 sub foo() {
-    print $x, " is ", @xs ^_ ' ', "\n";
+    print $x, " is ", @xs >>_<< ' ', "\n";
     $y = 0;
     for @xs { $y = $y + $_ }
 }
Index: languages/perl6/t/compiler/hyper.t
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/compiler/hyper.t,v
retrieving revision 1.2
diff -u -r1.2 hyper.t
--- languages/perl6/t/compiler/hyper.t  1 Nov 2003 12:07:09 -0000       1.2
+++ languages/perl6/t/compiler/hyper.t  26 Nov 2003 23:29:13 -0000
@@ -13,13 +13,13 @@
     my @x = (3,4);
     my @b = (5,6);
     my $i = 2;
-    parray @a ^* @x ^+ @b;
-    parray $i ^* @x ^+ @b;
-    parray @a  * @x ^+ @b;
-    parray 2 * 3 ^+ @b;
-#    print1(@a ^* @x  + @b); # Array math not in 0.0.7
+    parray @a >>*<< @x >>+<< @b;
+    parray $i >>*<< @x >>+<< @b;
+    parray @a  * @x >>+<< @b;
+    parray 2 * 3 >>+<< @b;
+#    print1(@a >>*<< @x  + @b); # Array math not in 0.0.7
 # IMCC clobbers too many registers with this:
-#     @y = @a ^<< @a;
+#     @y = @a >><<<< @a;
 #     print1('(' _ @y[0] _ ', ' _ @y[1] _ ')');
 }
 CODE
@@ -35,7 +35,7 @@
     my $a = 2.1;
     my @x = 1..1000;
     my @b = 1001..2000;
-    my @c = $a ^* @x ^+ @b;
+    my @c = $a >>*<< @x >>+<< @b;
     print1(@c[0]);
     print1(@c[9]);
     print1(@c[99]);
@@ -61,11 +61,11 @@
     parray(@c);
     @c = @a || @b;
     parray(@c);
-    @c = @a ^&& @b;
+    @c = @a >>&&<< @b;
     parray(@c);
-    @c = @a ^|| @b;
+    @c = @a >>||<< @b;
     parray(@c);
-    @c = @a ^~~ @b;
+    @c = @a >>^^<< @b;
     parray(@c);
 }
 CODE
@@ -81,18 +81,18 @@
 sub main () {
     my @a = (1..3);
     my @b = (4..9);
-    my @c = @a ^+ @b;
-    print @c ^_ ' ',"x\n";
-    @c = @b ^+ @a;
-    print @c ^_ ' ',"x\n";
-    @b = @b ^+ @a;
-    print @b ^_ ' ',"x\n";
+    my @c = @a >>+<< @b;
+    print @c >>_<< ' ',"x\n";
+    @c = @b >>+<< @a;
+    print @c >>_<< ' ',"x\n";
+    @b = @b >>+<< @a;
+    print @b >>_<< ' ',"x\n";
     @b = (4..9);
-    @b ^+= @a;
-    print @b ^_ ' ',"x\n";
+    @b >>+=<< @a;
+    print @b >>_<< ' ',"x\n";
     @b = (4..9);
-    @a ^+= @b;
-    print @a ^_ ' ',"x\n";
+    @a >>+=<< @b;
+    print @a >>_<< ' ',"x\n";
 }
 CODE
 5 7 9 7 8 9 x
@@ -108,31 +108,31 @@
 my @b = 5..6;
 my @c;
 @c = @a;
[EMAIL PROTECTED] ^+= @b;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>+=<< @b;
+print @c >>_<< ' ',"x\n";
 @c = @b;
[EMAIL PROTECTED] ^+= @a;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>+=<< @a;
+print @c >>_<< ' ',"x\n";
 
 @c = @a;
[EMAIL PROTECTED] ^*= @b;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>*=<< @b;
+print @c >>_<< ' ',"x\n";
 
 @c = @a;
[EMAIL PROTECTED] ^**= @b;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>**=<< @b;
+print @c >>_<< ' ',"x\n";
 
 @c = @a;
[EMAIL PROTECTED] ^/= @b;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>/=<< @b;
+print @c >>_<< ' ',"x\n";
 
 @c = @b;
[EMAIL PROTECTED] ^%= @a;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>%=<< @a;
+print @c >>_<< ' ',"x\n";
 
 @c = @b;
[EMAIL PROTECTED] ^-= @a;
-print @c ^_ ' ',"x\n";
[EMAIL PROTECTED] >>-=<< @a;
+print @c >>_<< ' ',"x\n";
 CODE
 /7 9 4 x
 7 9 4 x
Index: languages/perl6/t/compiler/qsort.t
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/compiler/qsort.t,v
retrieving revision 1.1
diff -u -r1.1 qsort.t
--- languages/perl6/t/compiler/qsort.t  21 Jul 2002 16:09:27 -0000      1.1
+++ languages/perl6/t/compiler/qsort.t  26 Nov 2003 23:29:13 -0000
@@ -27,10 +27,10 @@
 sub main() {
     my @a = 1..10;
     qsort @a, 0, @a - 1;
-    print @a ^_ "\n";
+    print @a >>_<< "\n";
     @a = (10,9,8,7,6,5,4,3,2,1);
     qsort @a, 0, @a - 1;
-    print @a ^_ "\n";
+    print @a >>_<< "\n";
 }
 CODE
 10

Reply via email to