[Python-Dev] Boolean transition
Tim Peters
tim.one@comcast.net
Sun, 10 Mar 2002 15:05:23 -0500
[Tim]
> Java disallowed mixing ints with booleans specifically to stop the
>
> if (x = 1)
>
> flavor of C bug, but Python stops those via a different gimmick.
[Paul Prescod]
> I don't know if that's true or not, but it doesn't seem relevant.
Then you should have the grace to presume I'm not lying <wink>. It's
relevant only if *why* languages do what they do is interesting to you. It
is to me.
> Python's decision should be independent of it's C heritage so we need
> to look not only at why C-derived languages did what they did but also
> other languages. Most languages with no C heritage at all have a
> non-numeric boolean type.
I wouldn't presume to claim what "most languages" do, as I'm only familiar
with a relative handful.
> Here are other languages that (based on some admittedly cursory
> research) treat booleans as entirely distinct from integers:
I don't grasp why this should be interesting, in the absence of their design
rationales.
> * Scheme
> * SML
> * JavaScript
> * Visual Basic
> * Eiffel
> * Smalltalk
>
> I'd be curious to hear a list of high level, GC'd languages in the other
> camp.
I'm only interested in what's most useful. If I weren't, I'd sure wonder
what the heck garbage collection has to do with this <wink>.
> Methinks your Fortran/C bias shows. ;) And it isn't pretty.
You're arguing for the Fortran approach, and I don't have a C bias: I first
picked up C very late in my programming life. The languages I cut my teeth
on do include Fortran Classic, which had a non-numeric "logical" type with
manifest constants .TRUE. and .FALSE.; LISP 1.5, where the empty list "was
true" and all other values "were false"; SNOBOL4, which had no true/false
concept at all ("success" and "failure" drove control flow there); Pascal,
which is "like Fortran" in this respect; and APL, which indeed thrived on
doing arithmetic with 1/0 true/false values. The only one that was "really
like Python" here was APL.
I liked the APL approach best, simply because it was most useful. Perhaps
that's because my non-programming background is in discrete mathematics,
where identifying 0/1 with false/true is of great practical value. For
example, see "Concrete Mathematics" (Knuth, Graham and Patashnik), where
treating a true/false result as 1/0 is so common it's indicated merely by
surrounding a predicate expression with plain square brackets. This was a
notational advance over the non-programming state of the art (most texts
before CM, including Knuth's TAoCP, use a clumsy Kronecker delta notation).
The programming state of the art would be advanced a little by Guido's PEP,
in my view of the world.
>> days_in_year = 365 + is_leap(year)
>>
>> or
>>
>> print [("off", "on")[switch] for switch in switch_list]
> Personally, I find those both as obfuscatory workarounds for the lack of
> a terniary.
Ahem -- I thought we were disparaging *my* "C bias" here <wink>. How many
of the languages in your list above have a ternary operator? Languages that
don't distiguish expressions from statements (like your Scheme example) use
their all-purpose if/else constructs for this, but C introduced "the ternary
wart" for languages that do distinguish. It got into that mess by departing
from Algol, which also distinguished, but had both statement and expression
forms of if/else. IMO, C and Pascal both lost by departing from Algol here.
> I don't mind spelling out a terniary as an if/else and I don't mind
> spelling these out either.
Which then looks to me like a clumsy workaround for the lack of treating
false as 0 and true as 1. We're never going to agree on this, so enough.