<br><br><div class="gmail_quote">On Tue, Oct 18, 2011 at 1:58 AM, Bert Freudenberg <span dir="ltr"><<a href="mailto:bert@freudenbergs.de">bert@freudenbergs.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On 18.10.2011, at 05:11, Chris Muller wrote:<br>
<br>
> (From vm-dev list)<br>
>> But I much prefer foo ~~ bar ifTrue: than foo == bar ifFalse:.<br>
><br>
> Hi Eliot. May I ask why you prefer the former over the latter?<br>
><br>
> I'm interested because I'm working on an application where the folks<br>
> involved prefer something similar, to where they write (expr) not<br>
> ifTrue: [ ] rather than (expr) ifFalse: [ ].<br>
><br>
> I know you wouldn't do that but your statement definitely piqued my<br>
> surprise and curiosity.<br>
<br>
</div></div>Maybe this is a clue: very few other programming languages have an "else"-case without a preceding "if true". So maybe for people versed in multiple languages the ifFalse: feels wrong?<br>
</blockquote><div><br></div><div>For me, it's not about feeling right or wrong, it's about directly expressing intent. For example, in some loop where a predicate is being used to select or reject elements I would write "obj predicate ifTrue:" if I were looking for the element based on predicate and "obj predicate ifFalse:" if I were trying to filter-out elements based on predicate, just as I'd write collection select: [:e| e predicate] to select items based on predicate and collection reject: [:e| e predicate] to filter them out, and I would /not/ write collection select: [:e| e predicate not] to filter them out unless performance was really really important (since reject: adds another block activation for each element). I'm trying to communicate whether I'm selecting or rejecting based on predicate, and not wanting the reader to go through mental hoops by internally collapsing predicate not ifFalse: to predicate ifTrue: and vice verse.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
I personally like "expr ifFalse:" better than "expr not ifTrue:".</blockquote><div><br></div><div>Agreed. expr not ifTrue: & expr not ifFalse are perverse.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
And I read "~~" as "not identical" which also has a mental "not" in it, so I prefer "== ifFalse" :)<br></blockquote><div><br></div><div>Ah, there we differ. I view == and ~~ as complementary predicates. If I'm writing foo == bar ifTrue: I'm clearly selecting, and foo ~~ bar ifTrue: I'm clearly rejecting, but foo == bar ifFalse: is IMO worse (more cognitively demanding) than foo ~~ bar ifTrue:.</div>
<div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
- Bert -<br>
<br>
<br>
<br>
</font></blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>