Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^4: 'xor' operator is not a sibling to 'or' and 'and'?

by rsFalse (Chaplain)
on Dec 19, 2019 at 07:56 UTC ( [id://11110381]=note: print w/replies, xml ) Need Help??


in reply to Re^3: 'xor' operator is not a sibling to 'or' and 'and'?
in thread 'xor' operator is not a sibling to 'or' and 'and'?

>> Binary "and" returns the logical conjunction of the two surrounding expressions.

It's not much about short-circuit, but more about logical return value? I understand 'logical' as being Boolean, i.e. 1 or ''/0. So if an operator doesn't return a boolean value then this should be emphasized, and the sentence about return value rather should be corrected.
  • Comment on Re^4: 'xor' operator is not a sibling to 'or' and 'and'?

Replies are listed 'Best First'.
Re^5: 'xor' operator is not a sibling to 'or' and 'and'?
by soonix (Canon) on Dec 19, 2019 at 09:36 UTC
    regarding "Boolean", see "Scalar values" in perldata:
    A scalar value is interpreted as FALSE in the Boolean sense if it is undefined, the null string or the number 0 (or its string equivalent, "0"), and TRUE if it is anything else. The Boolean context is just a special kind of scalar context where no conversion to a string or a number is ever performed. Negation of a true value by ! or not returns a special false value. When evaluated as a string it is treated as "" , but as a number, it is treated as 0. Most Perl operators that return true or false behave this way.
    You seem to think upon a "really" boolean datatype with exactly two distinct values. This is not the case here.
Re^5: 'xor' operator is not a sibling to 'or' and 'and'?
by LanX (Saint) on Dec 19, 2019 at 14:41 UTC
    Perl has no Boolean type, it is interpreting values in boolean context, (which is a specialized scalar context).

    There are only two default scalars 1 and ""/0 (i.e. !!1 and !!0) in case a Boolean result needs to be generated, like when using not (sic)

    The extra behaviour of and/or to return the last evaluated side is closely related to short circuiting, and will by definition lead to a appropriate scalar again.

    AFAIK is this feature boroughed from C, but can't be possibly extended to not or even xor

    Update

    That's easily proven by translating xor to a term based on and/or, since this can't be done without not

    A xor B := ( A and not B) or ( B and not A)

    Besides inconsistencies it's also not well defined, because the two sides of the and/or terms can be swapped (commutativity)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      >> A xor B := ( A and not B) or ( B and not A)

      I only want to leave here an example: although 'logically' they return the same 'Perl-truthness', in this case they won't return same value:
      perl -wle 'my( $A, $B ); print for map "[$_]", ( $A xor $B ), ( $A and + not $B or $B and not $A ); '
      output ('' vs. undefined):
      Use of uninitialized value $_ in concatenation (.) or string at -e lin +e 1. [] []
        yep
        perl -MData::Dump=pp @values=("true",undef); for $A (@values) { for $B (@values) { pp [$A,$B], [ ($A xor $B), ( ($A && !$B) || ($B && !$A) ) ]; } } __END__ (["true", "true"], ["", ""]) (["true", undef], [1, 1]) ([undef, "true"], [1, 1]) ([undef, undef], ["", undef])

        but if you apply De Morgan's law, you'll always get "default" Booleans:

        perl -MData::Dump=pp @values=("true",undef); for $A (@values) { for $B (@values) { pp [$A,$B], [ ($A xor $B), !( ( !$A || $B) && (!$B || $A) ) ]; } } __END__ (["true", "true"], ["", ""]) (["true", undef], [1, 1]) ([undef, "true"], [1, 1]) ([undef, undef], ["", ""])

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11110381]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (8)
As of 2024-04-23 14:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found