<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body>
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p>Hi Eliot,</p>
<p><br>
</p>
<p>thanks for your reaction to change this behavior via <span>Compiler-eem.442.</span></p>
<p><span><br>
</span></p>
<p><span>Best,</span></p>
<p><span>Christoph</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">
<div><font size="3" color="black"><span style="font-size:12pt"><a href="http://www.hpi.de/" target="_blank" rel="noopener noreferrer" id="LPNoLP"><font size="2"><span id="LPlnk909538"><font color="#757B80"></font></span></font></a></span></font></div>
</font></div>
</div>
</font></div>
</div>
</div>
</div>
</div>
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Eliot Miranda <eliot.miranda@gmail.com><br>
<b>Gesendet:</b> Montag, 14. September 2020 15:29:00<br>
<b>An:</b> The general-purpose Squeak developers list<br>
<b>Betreff:</b> Re: [squeak-dev] Compiler evaluate: '' | 'inner' argument in parser</font>
<div> </div>
</div>
<div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_default" style="font-size:large">Hi Christoph,<br>
</div>
<div class="gmail_default" style="font-size:large"><br>
</div>
<div class="gmail_default" style="font-size:large">  ignore my first response.  I hadn't looked at the code yet.  It hasn't changed my conclusions, but it alters the proposed solution.</div>
<div class="gmail_default" style="font-size:large"><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Sep 14, 2020 at 5:17 AM Thiede, Christoph <<a href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de">Christoph.Thiede@student.hpi.uni-potsdam.de</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div id="gmail-m_-8822688524506526607divtagdefaultwrapper" style="font-size:12pt;color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif" dir="ltr">
<p>Hi all,</p>
<p>I just evaluated the following line and was surprised by the result:</p>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<p><span>Compiler evaluate: '' for: 42.</span></p>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div id="gmail-m_-8822688524506526607divtagdefaultwrapper" style="color:rgb(0,0,0)" dir="ltr">
<p><span style="font-size:12pt">The answer was nil, whereas I rather would have expected
</span><span style="font-size:12pt"><strike>the answer to life the universe and everything</strike> 42, as it is the case for full methods compiled on an object. What do you think about this, which should be the right output?</span></p>
</div>
</div>
</blockquote>
<div><br>
</div>
<div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4"><span class="gmail_default">I</span> agree with you that the null statement should evaluate to self at method level.  IIRC, the ANSI standard says that the null statement evaluated to the last
 block argument did blocks with arguments (to legalize a quirk in Peter Deutsch’s closure compiler for ObjectWorks 2.5 and subsequent).  And clearly the null statement in a block evaluates to nil.  I hunk that the null statement should evaluate to self at method
 level and nil at block level, irrespective of the number of block arguments.</font>
<div><font size="4"><br>
</font></div>
<div><font size="4">To be clear I would have these tests</font></div>
<div><font size="4"><br>
</font></div>
<div><font size="4" face="times new roman, serif">self assert: (Compiler evaluate: '' for: 42) equals: 42.</font></div>
<div><font size="4" face="times new roman, serif">self assert: ([:arg|] value: 42) equals: nil.</font></div>
<div><font size="4" face="times new roman, serif">self assert: [] value equals: nil.</font></div>
<div><font size="4"><span style="font-family:Calibri,Helvetica,sans-serif"><br>
</span></font></div>
<div><font size="4"><span class="gmail_default" style="font-family:Calibri,Helvetica,sans-serif">Looking at the code, when I added closures I took the existing compiler as a given and hence perpetuated the bug that</span><span class="gmail_default"><font face="arial, sans-serif"> </font></span><font face="arial, sans-serif">(Compiler evaluate:
 '' for: 42)<span class="gmail_default"> isNil.  Looking at the code I don't like the inner: argument, and for the longest time I have felt like </span><span class="gmail_default">the </span></font>statements:innerBlock:<span class="gmail_default"> method</span></font><span class="gmail_default" style="font-size:large"> was
 unnecessary. </span><span style="font-family:arial,sans-serif"><span class="gmail_default" style="font-size:large">So one fix in</span><span class="gmail_default"><font size="4"> </font></span></span><font size="4">Parser>>#method:context:<span class="gmail_default">
 is to replace</span></font></div>
<div><font size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4"><span class="gmail-Apple-tab-span" style="white-space:pre"></span><font face="times new roman, serif">self statements: #() innerBlock: doit.</font></font></div>
<div><font size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4"><span class="gmail_default">with</span></font></div>
<div><font size="4"><span class="gmail-Apple-tab-span" style="white-space:pre"></span><font face="times new roman, serif">self statements: #() innerBlock: false blockNode: BlockNode new.</font></font></div>
<div><font size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4"><span class="gmail_default">Another improvement would be to simply substitute the variable to be used for empty statements, so we would use
</span></font></div>
<div><font size="4"><span class="gmail_default"><br>
</span></font></div>
<div>
<div><font size="4" face="times new roman, serif">Parser>>#method:context:<span class="gmail_default"></span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">...</span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>self statements: #() <span class="gmail_default">defaultVariable: 'self' </span>blockNode: BlockNode new.</font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">...</span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default"><br>
</span></font></div>
<div>
<div><font size="4" face="times new roman, serif">Parser>>#statements: argNodes defaultVariable: selfOrNil blockNode: theBlockNode</font></div>
<div><font size="4" face="times new roman, serif"><br>
</font></div>
<div><span class="gmail-Apple-tab-span" style="white-space:pre"><span class="gmail_default"><font size="4" face="times new roman, serif">...</font></span></span></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>ifFalse: </font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>[self addComment.</font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span> stmts size = 0 ifTrue: </font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>[stmts addLast:  (encoder encodeVariable: selfOrNil)]]].</font></div>
<div>
<div class="gmail_default"><font size="4" face="times new roman, serif">...</font></div>
<font size="4" face="times new roman, serif"><br>
</font></div>
<div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">Parser>>#</span>blockExpression</font></div>
<div><span class="gmail-Apple-tab-span" style="white-space:pre"><span class="gmail_default"><font size="4" face="times new roman, serif">...</font></span></span></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>self statements: variableNodes defaultVariable: '<span class="gmail_default">nil</span>' blockNode: blockNode.</font></div>
</div>
<div>
<div class="gmail_default" style="font-size:large">...</div>
<br>
</div>
<div><br>
</div>
<div>
<div class="gmail_default" style="font-size:large">but maybe the following:</div>
<div class="gmail_default" style="font-size:large">
<div><font size="4" face="times new roman, serif"><br>
</font></div>
<div><font size="4" face="times new roman, serif">Parser>>#method:context:<span class="gmail_default"></span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">...</span></font></div>
</div>
<div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>doit ifTrue: [blk returnLast]</font></div>
<div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>ifFalse: [blk returnSelfIfNoOther: encoder].</font></div>
<div class="gmail_default" style="font-size:large"><font face="times new roman, serif">...</font></div>
<div class="gmail_default" style="font-size:large"><br>
</div>
<div class="gmail_default" style="font-size:large">indicates that either</div>
<div class="gmail_default" style="font-size:large"><span style="white-space:pre;font-family:"times new roman",serif"></span><span style="font-family:"times new roman",serif">stmts size = 0 ifTrue: </span></div>
<div><span style="font-family:"times new roman",serif;font-size:large"></span></div>
<div><font size="4" face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre"></span>[stmts addLast:  (encoder encodeVariable: selfOrNil)]</font></div>
</div>
</div>
<div><font face="arial, sans-serif" size="4"><span class="gmail_default">is wrong and the defaulting should happen in the sender (in Parser>>#method:context: and Parser>>#primaryExpression where it sends blockExpression), or that we should pass in a selector
 which is performed in the method to determine what to do.  So the method would then be e.g.</span></font></div>
</div>
<div><font face="arial, sans-serif" size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4"><span class="gmail_default"><font face="arial, sans-serif">    </font><font face="times new roman, serif">Parser>>#statements:blockNode:ifEmpty:</font></span></font></div>
<div><font face="arial, sans-serif" size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font face="arial, sans-serif" size="4"><span class="gmail_default">and the senders would look like, e.g.</span></font></div>
<div><font face="arial, sans-serif" size="4"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4" face="times new roman, serif">Parser>>#method:context:<span class="gmail_default"></span></font></div>
<div class="gmail_default"><font size="4" face="times new roman, serif"><span class="gmail_default">...</span></font></div>
</div>
<div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4" face="times new roman, serif"><span class="gmail_default">   </span>self statements: #() blockNode: BlockNode new<span class="gmail_default"> ifEmpty: (doit ifTrue: [#returnLast:] ifFalse: [#returnSelfIfNoOther:)</span>.</font></div>
<div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4" face="times new roman, serif"><span class="gmail_default">   </span>blk := parseNode.</font></div>
<div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4" face="times new roman, serif"><span class="gmail_default">   </span>hereType == #doIt ifFalse: [^self expected: 'Nothing more']. </font></div>
<div class="gmail_quote" style="color:rgb(0,0,0)">
<div class="gmail_default"><font face="times new roman, serif" size="4">...<br>
</font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default"><br>
</span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">Parser>>#blockExpression</span></font></div>
<div><font size="4" face="times new roman, serif"><span class="gmail_default">...</span></font></div>
<div>
<div class="gmail_quote"><font face="times new roman, serif" size="4"><span class="gmail_default">   </span>self statements: variableNodes blockNode: BlockNode new<span class="gmail_default"> ifEmpty: #returnNilIfEmpty:</span>.</font></div>
</div>
</div>
<div><span style="font-family:"times new roman",serif;font-size:large;color:rgb(0,0,0)">...</span> </div>
<div><br>
</div>
<div>
<div class="gmail_default" style="font-size:large">I'm interested in your reading.  I think you should implement whatever makes most sense to you. I'm happy to rebiew.</div>
<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div id="gmail-m_-8822688524506526607divtagdefaultwrapper" style="color:rgb(0,0,0)" dir="ltr">
<p style="font-family:Calibri,Helvetica,sans-serif;font-size:12pt"><span style="font-size:12pt">I was even more surprised after taking a look into the relevant Parser implementation, which is #</span><span style="font-size:12pt">statements:innerBlock:blockNode:.
 Actually, the 'inner' argument's sole purpose is to use 'nil' instead of 'self' as a return value if there are zero statements. If we would not like to have this extra rule for doIt snippets, we would only have to change #method:context:[encoder:] and pass
 'false' instead of 'doit' to #statements:innerBlock:.</span></p>
<p style="font-family:Calibri,Helvetica,sans-serif;font-size:12pt"><span><span><span><span>I'm probably missing some logical consequences of the syntactic concept of blocks, methods, and doits, so I would like to hear your thoughts on this.</span></span></span></span></p>
</div>
</div>
</blockquote>
<div><br>
</div>
<div class="gmail_default" style="font-size:large">This is not so much philosophical as rushed.  When I added closures I wanted not to break the compiler and DTSTTCPW because I had a VM to write.  I wanted to clean things up but I risked making too many mistakes
 so I erred on the side of minimally extending the compiler rather than making it better.</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div id="gmail-m_-8822688524506526607divtagdefaultwrapper" style="color:rgb(0,0,0)" dir="ltr">
<p style="font-family:Calibri,Helvetica,sans-serif;font-size:12pt"><span><span><span><span>Best,</span></span></span></span></p>
<p style="font-family:Calibri,Helvetica,sans-serif;font-size:12pt"><span><span><span><span>Christoph</span></span></span></span></p>
</div>
</div>
</blockquote>
</div>
<div><br>
</div>
<div dir="ltr" class="gmail_signature">
<div dir="ltr">
<div><span style="font-size:small;border-collapse:separate">
<div>_,,,^..^,,,_<br>
</div>
<div>best, Eliot</div>
</span></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>