<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<p>Hi all,</p>
<p><br>
</p>
<p>I don't see why you would not like to see #isNilOr: or #notNilAnd: in "production" code?<span style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt"> I think their names are self-explaining.</span></p>
<div id="Signature">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody">
<div class="_rp_U4 ms-font-weight-regular ms-font-color-neutralDark rpHighlightAllClass rpHighlightBodyClass" id="Item.MessageUniqueBody" style="font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont">
<div dir="ltr">
<div id="divtagdefaultwrapper"><font face="Calibri,Helvetica,sans-serif,EmojiFont,Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols">
<div id="Signature">
<div style="margin:0px"><font style="font-family:Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont"></font></div>
</div>
</font></div>
</div>
</div>
</div>
<div class="_rp_T4" id="Item.MessagePartBody"><br>
</div>
<div class="_rp_T4" id="Item.MessagePartBody">> <span>(xyz := ...) notNil and: [xyz ...]</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span><br>
</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>To me, this reads rather ugly. Assignment expressions are always a bit counter-intuitive as multiple things happen at a time. They're fine in order to optimize *really* performance-critical things, but I always try
 to avoid them in favor of overall readability.</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>Furthermore, I see a big advantage in avoiding temps wherever you can use block args: It helps you to minimize the scope of variables that are only useful to be accessed in a certain area. It just increases
 the defect potential if you have a not-very-short method like this:</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span><br>
</span></div>
</div>
</div>
</div>
</div>
</div>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>someNotVeryShortMethod</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>| foo <span style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:16px">
graffle </span>bar baz |</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>foo := self someOperation.</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>graffle := foo asBarCompatibleThing.</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>bar := self someOtherOperation.</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt">((baz := </span><span style="font-size:12pt">bar property) notNil and: [baz meetsConditionOne or: [baz meetsConditionTwo]])</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span>    ifFalse: [^ foo].</span></div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt">^ foo mixWith: baz "Hm, do I need bar or baz here? Actually I </span><span style="font-size:12pt">meant bar, but that overcrowed temp list confused me so I just produced a bug"</span></div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt"><br>
</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt">Compared to this, a minimized scope can make things clearer:</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt"><br>
</span></div>
</div>
</div>
</div>
</div>
</div>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt">
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<div dir="ltr" style="font-size:12pt">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; margin:0px">
<div class="_rp_T4" id="Item.MessagePartBody">someNotVeryShortMethod</div>
</div>
</div>
</div>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<div dir="ltr" style="font-size:12pt">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; margin:0px">
<div class="_rp_T4" id="Item.MessagePartBody">| foo graffle bar |</div>
</div>
</div>
</div>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<div dir="ltr" style="font-size:12pt">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; margin:0px">
<div class="_rp_T4" id="Item.MessagePartBody">foo := self someOperation.</div>
</div>
</div>
</div>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<div dir="ltr" style="font-size:12pt">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; margin:0px">
<div class="_rp_T4" id="Item.MessagePartBody">graffle := foo convertForBarCompatibility.</div>
</div>
</div>
</div>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<div dir="ltr" style="font-size:12pt">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; margin:0px">
<div class="_rp_T4" id="Item.MessagePartBody">bar := self someOtherOperation.</div>
</div>
</div>
</div>
(bar property notNilAnd: [:baz | meetsConditionOne or: [baz meetsConditionTwo]])</span></div>
</div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt">    ifFalse: [^ foo].</span></div>
<div class="_rp_T4" id="Item.MessagePartBody"><span style="font-size:12pt"></span><span style="font-size:12pt">^ foo mixWith: bar "Ah, baz is not known as this place and I got a compiler error. So this must be bar!</span><span style="font-size:12pt">"</span></div>
</div>
</div>
</div>
</blockquote>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
Some other thing I see quite often is the following:</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
checkArg: arg</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
^ arg simpleProperty notNil and: [</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
    self basicCheckArg: arg simpleProperty]</div>
</blockquote>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
While this is fine for most cases, this makes it harder to implement #simpleProperty as an expensive or non-side-effect-free operation. Thus it would be better to write the following instead:</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div>
<blockquote style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:16px; margin:0px 0px 0px 40px; border:none; padding:0px">
<div dir="ltr" style="font-size:12pt">checkArg: arg</div>
<div dir="ltr" style="font-size:12pt">property := <span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:16px">arg simpleProperty.</span></div>
<div dir="ltr" style="font-size:12pt">^ property notNil and: [</div>
<div dir="ltr" style="font-size:12pt">    self basicCheckArg: property]</div>
</blockquote>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
<br>
</div>
</div>
But programmers are lazy, so they often don't introduce an extra tempvar ... Instead, any protocol that supplies arguments to the caller encourages you to use these arguments:</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
</div>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
checkArg: arg</div>
</div>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
^ arg simpleProperty notNilAnd: [:property |</div>
<div dir="ltr" style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols; font-size:12pt">
    <span style="font-size:12pt">self basicCheckArg: property]</span></div>
</div>
</div>
</blockquote>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
Plus, it's just shorter :-)</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<span style="font-size: 12pt;">> </span><span style="font-size: 12pt;">They are especially susceptible to misuse when their return value is </span><span style="font-size: 12pt;">ignored; in which case they are both equivalent to #ifNotNil:.</span><br>
</div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<span style="font-size:12pt"><br>
</span></div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<span style="font-size:12pt">What return value are you talking about? Did you mean the block argument?</span></div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<span style="font-size:12pt"><br>
</span></div>
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<span style="font-size:12pt">> </span><span style="font-size: 12pt;">Have you had a look at Java 8's Optional class? Nil can receive messages in Smalltalk, which Java null can't. Is nil therefore a good empty Optional or should these concepts be separate?</span><span style="font-size:12pt">
<div><br>
</div>
<div>Are you talking about some kind of automatic null object that ignores every message? Or do you complain that "<span>nil handles: #foo" does not raise an error, just for example? :-)</span></div>
<div><span><br>
</span></div>
<div>Best,</div>
<div>Christoph</div>
</span></div>
</div>
</div>
<div>
<div>
<div dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<div dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
<div style="color:rgb(0,0,0)">
<div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Levente Uzonyi <leves@caesar.elte.hu><br>
<b>Gesendet:</b> Samstag, 21. März 2020 20:25 Uhr<br>
<b>An:</b> The general-purpose Squeak developers list<br>
<b>Betreff:</b> Re: [squeak-dev] #isNilOr:, #notNilAnd:</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt">
<div class="PlainText">Hi Christoph,<br>
<br>
They are okay for scripts, but we know that methods like that always end <br>
up being used out of scripts, and are even misused every now and then.<br>
They are especially susceptible to misuse when their return value is <br>
ignored; in which case they are both equivalent to #ifNotNil:.<br>
<br>
I'm also not sure whether these methods belong to ProtoObject or not.<br>
I know the other nil handling methods are there as well, but that doesn't <br>
mean all such methods belong there.<br>
E.g. #ifNil:/#ifNotNil: should be there because the current compiler and <br>
VM will make those available for all objects provided the methods are <br>
inlined. But #isNil and #notNil have no such properties, so they belong <br>
more to Object than ProtoObject in my opinion.<br>
<br>
<br>
Levente<br>
<br>
On Mon, 16 Mar 2020, Thiede, Christoph wrote:<br>
<br>
> <br>
> Hi all,<br>
> <br>
> <br>
> after the release has been managed successfully, I would like to kindly push this proposal. In the latest months, I found myself to really often desiring #isNilOr: or #notNilAnd:. How would you think about these convenience<br>
> selectors? :-)<br>
> <br>
> <br>
> Best,<br>
> <br>
> Christoph<br>
> <br>
> _________________________________________________________________________________________________________________________________________________________________________________________________________________________________<br>
> Von: Thiede, Christoph<br>
> Gesendet: Mittwoch, 11. Dezember 2019 11:01:44<br>
> An: Squeak Dev<br>
> Betreff: #isNilOr:, #notNilAnd:  <br>
> <br>
> Hi all, just another idea for a hypothetic extension to ProtoObject:<br>
> <br>
> <br>
> ProtoObject >> #isNilOr: aBlock<br>
> <br>
> ^ aBlock cull: self<br>
> <br>
> UndefinedObject >> #isNilOr: aBlock<br>
> <br>
> ^ true<br>
> <br>
> ProtoObject >> #notNilAnd: aBlock<br>
> <br>
> ^ aBlock cull: self<br>
> <br>
> UndefinedObject >> #notNilAnd: aBlock<br>
> <br>
> ^ false<br>
> <br>
> <br>
> Examples:<br>
> <br>
> parentObject notNilAnd: #canBrowseSubtopic.<br>
> <br>
> helpClass notNilAnd: [:hC| hC usesCodeStyling].<br>
> <br>
> self selectionIndex isNilOr: [:index | index > 2].<br>
> <br>
> anObject isNilOr: #isZero.<br>
> <br>
> foo isNilOr: #isNotEmpty.<br>
> <br>
> <br>
> Just a bit syntactic sugar for idiomatic problems such as below. In particular, I found several possible applications for #notNilAnd: in my image.<br>
> <br>
> <br>
> Go ahead and tell me why it would be a bad idea :)<br>
> <br>
> <br>
> Best,<br>
> <br>
> Christoph<br>
> <br>
> <br>
> _________________________________________________________________________________________________________________________________________________________________________________________________________________________________<br>
> Von: Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Thiede, Christoph<br>
> Gesendet: Freitag, 25. Oktober 2019 19:21 Uhr<br>
> An: gettimothy via Squeak-dev<br>
> Betreff: Re: [squeak-dev] The Inbox: HelpSystem-Core-ct.123.mcz  <br>
> <br>
> If you're needing a decision, I'd vote for option 3.<br>
> <br>
> _________________________________________________________________________________________________________________________________________________________________________________________________________________________________<br>
> Von: Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Taeumel, Marcel<br>
> Gesendet: Mittwoch, 16. Oktober 2019 11:14:15<br>
> An: gettimothy via Squeak-dev<br>
> Betreff: Re: [squeak-dev] The Inbox: HelpSystem-Core-ct.123.mcz  <br>
> Quick suggestion on the formatting. This one:<br>
> ^ self canBrowseTopic or: [<br>
>    parentTopic ifNotNil: #canBrowseSubtopic ifNil: [false]]<br>
> <br>
> could become:<br>
> <br>
> ^ self canBrowseTopic or: [<br>
>    parentTopic<br>
>    ifNil: [false]<br>
>    ifNotNil: [:topic | topic canBrowseSubtopic]]<br>
> <br>
> or:<br>
> <br>
> ^ self canBrowseTopic<br>
>       or: [parentTopic notNil and: [parentTopic canBrowseSubtopic]]<br>
> <br>
> Hmmm... what are other opinions on this? There is no need for #ifNil/ifNotNil in such a boolean expression?<br>
> <br>
> Best,<br>
> Marcel<br>
> <br>
><br>
>       Am 13.10.2019 21:04:19 schrieb commits@source.squeak.org <commits@source.squeak.org>:<br>
><br>
>       A new version of HelpSystem-Core was added to project The Inbox:<br>
>       <a href="http://source.squeak.org/inbox/HelpSystem-Core-ct.123.mcz" id="LPlnk627352" previewremoved="true">
http://source.squeak.org/inbox/HelpSystem-Core-ct.123.mcz</a><br>
><br>
>       ==================== Summary ====================<br>
><br>
>       Name: HelpSystem-Core-ct.123<br>
>       Author: ct<br>
>       Time: 13 October 2019, 9:04:08.373932 pm<br>
>       UUID: dec7ceca-320f-d945-8d2a-c2f6a5e49a52<br>
>       Ancestors: HelpSystem-Core-ct.120<br>
><br>
>       Refactors HelpBrowser menu: Move menu stuff from HelpBrowser into HelpTopic hierarchy in favor of a better object design<br>
><br>
>       Thanks again, Marcel :-)<br>
><br>
>       =============== Diff against HelpSystem-Core-ct.120 ===============<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>browseTopicFromParent: (in category 'tools') -----<br>
>       + browseTopicFromParent: parentTopic<br>
>       +<br>
>       + self canBrowseTopic<br>
>       + ifTrue: [^ self browseTopic].<br>
>       + parentTopic canBrowseSubtopic<br>
>       + ifTrue: [^ parentTopic browseSubtopic: self].<br>
>       + !<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>canBrowseSubtopic (in category 'testing') -----<br>
>       + canBrowseSubtopic<br>
>       +<br>
>       + ^ false!<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ false!<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>canBrowseTopicFromParent: (in category 'testing') -----<br>
>       + canBrowseTopicFromParent: parentTopic<br>
>       +<br>
>       + ^ self canBrowseTopic or: [<br>
>       + parentTopic ifNotNil: #canBrowseSubtopic ifNil: [false]]!<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>topicMenu:parentTopic: (in category 'menus') -----<br>
>       + topicMenu: aMenu parentTopic: parentTopic<br>
>       +<br>
>       + aMenu<br>
>       + add: 'Inspect (i)' translated target: self action: #inspect;<br>
>       + add: 'Explore (I)' translated target: self action: #explore.<br>
>       + (self canBrowseTopicFromParent: parentTopic)<br>
>       + ifTrue: [<br>
>       + aMenu add: 'Browse (b)' translated<br>
>       + target: self<br>
>       + selector: #browseTopicFromParent:<br>
>       + argumentList: {parentTopic} ].<br>
>       +<br>
>       + ^ aMenu!<br>
><br>
>       Item was added:<br>
>       + ----- Method: AbstractHelpTopic>>topicMenuKey:fromParent: (in category 'menus') -----<br>
>       + topicMenuKey: aChar fromParent: parentTopic<br>
>       +<br>
>       + aChar<br>
>       + caseOf: {<br>
>       + [$b] -> [(self canBrowseTopicFromParent: parentTopic)<br>
>       + ifTrue: [ self browseTopicFromParent: parentTopic ]].<br>
>       + [$i] -> [self inspect].<br>
>       + [$I] -> [self explore] }<br>
>       + otherwise: [^ false].<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: ClassAPIHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: ClassBasedHelpTopic>>canBrowseSubtopic (in category 'testing') -----<br>
>       + canBrowseSubtopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: ClassBasedHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: DirectoryBasedHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: FileBasedHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was removed:<br>
>       - ----- Method: HelpBrowser>>browseTopic (in category 'actions') -----<br>
>       - browseTopic<br>
>       -<br>
>       - ^ (self currentTopic respondsTo: #browseTopic)<br>
>       - ifTrue: [self currentTopic browseTopic]<br>
>       - ifFalse: [self currentParentTopic browseSubtopic: self currentTopic]!<br>
><br>
>       Item was removed:<br>
>       - ----- Method: HelpBrowser>>canBrowseTopic (in category 'testing') -----<br>
>       - canBrowseTopic<br>
>       -<br>
>       - ^ (self currentTopic respondsTo: #browseTopic)<br>
>       - or: [self currentParentTopic respondsTo: #browseSubtopic:]!<br>
><br>
>       Item was removed:<br>
>       - ----- Method: HelpBrowser>>exploreTopic (in category 'actions') -----<br>
>       - exploreTopic<br>
>       -<br>
>       - ^ self currentTopic explore!<br>
><br>
>       Item was removed:<br>
>       - ----- Method: HelpBrowser>>inspectTopic (in category 'actions') -----<br>
>       - inspectTopic<br>
>       -<br>
>       - ^ self currentTopic inspect!<br>
><br>
>       Item was changed:<br>
>       ----- Method: HelpBrowser>>treeKey:from:event: (in category 'menus') -----<br>
>       treeKey: aChar from: aView event: anEvent<br>
><br>
>       anEvent anyModifierKeyPressed ifFalse: [^ false].<br>
>       + ^ (self currentTopic topicMenuKey: aChar fromParent: self currentParentTopic)!<br>
>       - aChar<br>
>       - caseOf: {<br>
>       - [$b] -> [self browseTopic].<br>
>       - [$i] -> [self inspectTopic].<br>
>       - [$I] -> [self exploreTopic]. }<br>
>       - otherwise: [^ false].<br>
>       - ^ true!<br>
><br>
>       Item was changed:<br>
>       ----- Method: HelpBrowser>>treeListMenu: (in category 'menus') -----<br>
>       treeListMenu: aMenu<br>
> <br>
><br>
>       + ^ self currentTopic<br>
>       + ifNil: [aMenu]<br>
>       + ifNotNil: [:topic | topic<br>
>       + topicMenu: aMenu<br>
>       + parentTopic: self currentParentTopic]!<br>
>       - self currentTopic ifNil: [^ aMenu].<br>
>       -<br>
>       - aMenu<br>
>       - add: 'Inspect (i)' action: #inspectTopic;<br>
>       - add: 'Explore (I)' action: #exploreTopic.<br>
>       -<br>
>       - self canBrowseTopic ifTrue: [<br>
>       - aMenu<br>
>       - addLine;<br>
>       - add: 'Browse (b)' action: #browseTopic].<br>
>       -<br>
>       - ^ aMenu!<br>
><br>
>       Item was added:<br>
>       + ----- Method: MethodListHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
><br>
>       Item was added:<br>
>       + ----- Method: PackageAPIHelpTopic>>canBrowseTopic (in category 'testing') -----<br>
>       + canBrowseTopic<br>
>       +<br>
>       + ^ true!<br>
> <br>
> <br>
> <br>
></div>
</span></font></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>