<html><head></head><body>*cough* Ruby and Perl *cough*<br>
<br>
Ruby has two 'or' operators. One is used normally:<br>
<br>
myval = a == 1 || a == 2<br>
# same as<br>
myval = (a == 1 || a == 2)<br>
<br>
The other one is a bit different:<br>
<br>
myval = a == 1 or a == 2<br>
# same as<br>
(myval = a == 1) or (a == 2)<br>
<br>
It's used for simple nil and false elision, since Ruby has a stricter concept of falseness than Python.<br>
<br>
But it's a bug magnet!! That's what I hated about Ruby. Type the wrong operator and get a hidden error.<br>
<br>
Sometimes, when I code in C++ a lot and then do something in Python, I'll do:<br>
<br>
if a || b:<br>
<br>
Then I realize my mistake and fix it.<br>
<br>
BUT, with this change, it wouldn't be a mistake. It would just do something entirely different.<br><br><div class="gmail_quote">On September 23, 2015 4:00:41 AM CDT, Nick Coghlan <ncoghlan@gmail.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">This may just be my C programmer brain talking, but reading the<br />examples in PEP 505 makes me think of the existing use of "|" as the<br />bitwise-or operator in both Python and C, and "||" as the logical-or<br />operator in C.<br /><br />Using || for None-coalescence would still introduce a third "or"<br />variant into Python as PEP 505 proposes (for good reasons), but<br />without introducing a new symbolic character that relates to "OR"<br />operations:<br /><br />    x | y: bitwise OR (doesn't short circuit)<br />    x or y: logical OR (short circuits based on bool(x))<br />    x || y: logical OR (short circuits based on "x is not None")<br /><br />(An analogy with C pointers works fairly well here, as "x || y" in C<br />is a short-circuiting operator that switches on "x != NULL" in the<br />pointer case)<br /><br />Taking some key examples from the PEP:<br /><br />    data = data ?? []<br />    headers = headers ?? {}<br />    data ?= []<br />    headers
?= {}<br /><br />When written using a doubled pipe instead:<br /><br />    data = data || []<br />    headers = headers || {}<br />    data ||= []<br />    headers ||= {}<br /><br />Translations would be the same as proposed n PEP 505 (for simplicity,<br />this shows evaluating the LHS multiple times, in practice that<br />wouldn't happen):<br /><br />    data = data if data is not None else []<br />    headers = headers if headers is not None else []<br />    data = data if data is not None else []<br />    headers = headers if headers is not None else []<br /><br />One additional wrinkle is that a single "|" would conflict with the<br />bitwise-or notation in the case of None-aware index access, so the<br />proposal for both that and attribute access would be to make the<br />notation "!|", borrowing the logical negation "!" from "!=".<br /><br />In this approach, where "||" would be the new short-circuiting binary<br />operator standing for "LHS if LHS is not None else RHS", in
"!|" the<br />logical negations cancel out to give "LHS if LHS is None else<br />LHS<OP>".<br /><br />PEP 505 notation:<br /><br />    title?.upper()<br />    person?['name']<br /><br />Using the "is not not None" pipe-based notation:<br /><br />    title!|.upper()<br />    person!|['name']<br /><br />And the gist of the translation:<br /><br />    title if title is None else title.upper()<br />    person if person is None else person['name']<br /><br />If this particular syntax were to be chosen, I also came up with the<br />following possible mnemonics that may be useful as an explanatory<br />tool:<br /><br />    "||" is a barrier to prevent None passing through an expression<br />    "!|" explicitly allows None to pass without error<br /><br />Regards,<br />Nick.<br /></pre></blockquote></div><br>
-- <br>
Sent from my Nexus 5 with K-9 Mail. Please excuse my brevity.</body></html>