On Fri, Dec 10, 2004 at 08:50:46PM +0100, Leopold Toetsch wrote:
> >> We need language lawyers ;)
>
> > IANAL, but I am a mathematician. Because C<xor> necessarily always
> > depends on *both* its arguments, analogies with C<and> and C<or> are
> > inappropriate. C<xor> cannot short-circuit, and it is not sensible
> > to return as result either of the arguments.
>
> 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.
> > Perl5 C<xor> always returns a "standard" boolean value, i.e.
> > dualvar(0, '') or dualvar(1, '1'). Perl6/Parrot should do the same
> > thing.
Keep in mind that in Perl 6 the boolean forms of C<and>, C<or>, and C<xor>
(the ones that always return 0 or 1) are C<?&>, C<?|>, and C<?^>.
So perhaps C<xor> should be able to return more than just 0 or 1.
Pm