[ From p6i ]
Patrick R. Michaud writes:
> On Fri, Dec 10, 2004 at 08:50:46PM +0100, Leopold Toetsch wrote:
> > Not quite. It gives one value if one is true or 0 (false). This is more
> > information then the perl5 implementation returns. The returned value (if
> > any) is still true but usable, if I just want one of both. Well that's
> > "logical xor" - not binary xor.
>
> Agreed. At some point this probably belongs on perl6-languages (and
> apologies if this posting to p6i is therefore inappropriate). But if
> the following hold (Perl 5):
>
> print (0 and "hello"); # outputs "0"
> print ("" and "hello"); # outputs ""
> print (0 or "hello"); # outputs "hello"
> print ("" or "hello"); # outputs "hello"
> print ("" or 0); # outputs "0"
> print (0 or ""); # outputs ""
> print (not("" or 0)); # outputs "1"
> print (not("a" and "b")); # outputs ""
>
> it seems like one should be able to do:
>
> print (0 xor "hello"); # outputs "hello"
> print ("" xor "hello"); # outputs "hello"
> print ("hello" xor 0); # outputs "hello"
> print ("hello" xor ""); # outputs "hello"
> print ("world" xor "hello"); # outputs ""
> print (0 xor ""); # outputs "1"
> print ("" xor 0); # outputs "1"
>
> Just as C<or> returns its first non-false argument, the interpretation
> of C<xor> would be that it returns its single non-false argument, or 1 if
> both (all?) arguments logically evaluate to false.
Well, IAAL. :-)
In particular, xor is analogous, operatorwise, to the junctive one().
one() represents its single true value when it evaluates to true in
conditionals:
my $smin = one(3,6,9,12) < 5;
So it seems logical that xor do the same. I don't see any loss of
generality in doing so, and you're keeping around more information.
For the PMC variant, it seems like returning *the* true PMC is the
correct thing to do, because the definiton of the canonical "true"
differs from language to language. Parrot has a canonical false.
Luke