<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">Hi Christoph,<br><div dir="ltr"><br></div><div dir="ltr"><br><blockquote type="cite">On Dec 11, 2019, at 2:01 AM, Thiede, Christoph <Christoph.Thiede@student.hpi.uni-potsdam.de> wrote:<br><br></blockquote></div><blockquote type="cite"><div dir="ltr">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">



<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p>Hi all, just another idea for a hypothetic extension to ProtoObject:</p>
<p><br></p></div></div></blockquote><div><br></div>Well, personally I don’t find the abbreviation compelling but would counsel against this for two  reasons:<div><br></div><div>1. (most important) ProtoObject exists to provide the absolute minimum protocol an object needs to be debugged by the system.  Ideally this would mean that ProtoObject *only* implement doesNotUnderstand: such that when sent a message a proto object or incomplete proxy (one whose doesNotUnderstand: method is yet to be defined) a debugger is raised rather then the VM aborting with a recursive not understood error.  ProtoObject is *not* a place to put protocol understood by all normal objects.</div><div><br></div><div>The whole point of ProtoObject is to support transparent proxies that raise doesNotUnderstand: when sent any message. All the protocol in ProtoObject other than doesNotUnderstand: is a colossal mistake and the result of serious misunderstanding of the utility and implementation of transparent forwarders.</div><div><br></div><div>2. we have a prototype adaptive optimizer/speculative inliner, Scorch, written by Clément Béra, with my having designed them lower levels of the architecture. I am currebtly making space in my work life to port this to Squeak and productise it.  This optimizer will automatically create inlined code that is much more efficient than these helped methods.  So these are a premature optimization.  </div><div><br></div><div>So please, no.</div><div><br></div><div><blockquote type="cite"><div dir="ltr"><div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr"><p>
</p>
<p>ProtoObject >> #isNilOr: aBlock</p>
<p><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; white-space: pre;"></span><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;">^
 aBlock cull: self</span><br>
</p>
<p><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;">UndefinedObject >> #isNilOr: aBlock</span></p>
<p><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;"><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; white-space: pre;"></span><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;">^
 true</span><br>
</span></p>
<p><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;"><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;"></span></span></p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
ProtoObject >> #notNilAnd: aBlock</p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<span style="white-space: pre;"></span>^ aBlock cull: self<br>
</p>
<div></div>

<p></p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
UndefinedObject >> #notNilAnd: aBlock</p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<span style="white-space: pre;"></span>^ false</p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
</p>
<p></p>
<div>
<div style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
</div>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<br>
</div>
<p></p>
<p>Examples:</p>
<p><span style="font-size: 12pt;">parentObject notNilAnd: #canBrowseSubtopic.</span><br>
</p>
<p><span style="font-size: 12pt;">helpClass </span><span style="font-size: 12pt;">notNilAnd: </span><span style="font-size: 12pt;">[:hC| hC usesCodeStyling].</span><br>
</p>
<p>self selectionIndex isNilOr: [:index | index > 2].</p>
<p><span style="font-size: 12pt;"></span></p>
<div id="Signature" style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt;">
<div name="divtagdefaultwrapper" style="font-family: Calibri, Arial, Helvetica, sans-serif; margin: 0px;">
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
<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;"></span>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
anObject isNilOr: #isZero.</p>
<p style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
foo isNilOr: #isNotEmpty.</p>
<div><br>
</div>
Just a bit syntactic sugar for idiomatic problems such as below. In particular, I found several possible applications
<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;">
for #</span><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;">notNilAnd: </span>in my image.
<p></p>
<p><span style="font-size: 12pt;"><br>
</span></p>
<p><span style="font-size: 12pt;">Go ahead and tell me why it would be a bad idea :)</span></p>
<p><span style="font-size: 12pt;"><br>
</span></p>
<p><span style="font-size: 12pt;">Best,</span></p>
<p><span style="font-size: 12pt;">Christoph</span></p>
<br>
<div style="color: rgb(0, 0, 0);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="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 Thiede, Christoph<br>
<b>Gesendet:</b> Freitag, 25. Oktober 2019 19:21 Uhr<br>
<b>An:</b> gettimothy via Squeak-dev<br>
<b>Betreff:</b> Re: [squeak-dev] The Inbox: HelpSystem-Core-ct.123.mcz</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif">
<p>If you're needing a decision, I'd vote for option 3.</p>
<p></p>
<div id="Signature">
<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>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="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 Taeumel, Marcel<br>
<b>Gesendet:</b> Mittwoch, 16. Oktober 2019 11:14:15<br>
<b>An:</b> gettimothy via Squeak-dev<br>
<b>Betreff:</b> Re: [squeak-dev] The Inbox: HelpSystem-Core-ct.123.mcz</font>
<div> </div>
</div>
<div>
<div id="__MailbirdStyleContent" style="font-size:10pt; font-family:Arial; color:#000000">
Quick suggestion on the formatting. This one:
<div><br>
</div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">^ self canBrowseTopic or: [</span><br style="font-family:Arial,Helvetica,sans-serif; font-size:13px">
<span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">   parentTopic ifNotNil: #canBrowseSubtopic ifNil: [false]]</span></div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">could become:</span></div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">^ self canBrowseTopic or: [</span><br style="font-family:Arial,Helvetica,sans-serif; font-size:13px">
<span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">   parentTopic</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">ifNil:
 [false]</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"> </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">ifNotNil:
 [:topic | topic canBrowseSubtopic]]</span></div>
</div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">or:</span></div>
<div><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div>
<div style="font-size:13.3333px">
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">^ self canBrowseTopic</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">      or: [parentTopic notNil and: </span><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">[parentTopic canBrowseSubtopic]]</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">Hmmm... what are other opinions on this? There is no need for #ifNil/ifNotNil in such a boolean expression?</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">Best,</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px">Marcel</span></div>
<div style="font-size:13.3333px"><span style="font-family:Arial,Helvetica,sans-serif; font-size:13px"><br>
</span></div>
<div style="font-size:13.3333px"><br>
</div>
</div>
</div>
<div class="mb_sig"></div>
<blockquote class="history_container" type="cite" style="border-left-style:solid; border-width:1px; margin-top:20px; margin-left:0px; padding-left:10px; min-width:500px">
<p style="color:#AAAAAA; margin-top:10px">Am 13.10.2019 21:04:19 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p>
<div style="font-family:Arial,Helvetica,sans-serif">A new version of HelpSystem-Core was added to project The Inbox:<br>
http://source.squeak.org/inbox/HelpSystem-Core-ct.123.mcz<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>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>


<span></span><br><span></span><br></div></blockquote></div></body></html>