<div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg">On Wed, Apr 12, 2017 at 6:51 PM, Levente Uzonyi <span class="gmail_msg"><<a href="mailto:leves@caesar.elte.hu" class="gmail_msg" target="_blank">leves@caesar.elte.hu</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Wouldn't it be better to make Generator >> #do: not use #atEnd?<br class="gmail_msg">
With the new implementation the following happens:<br class="gmail_msg">
<br class="gmail_msg">
| generator |<br class="gmail_msg">
generator := Generator on: [ :g | ].<br class="gmail_msg">
generator atEnd<br class="gmail_msg">
"==> false"<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">The generator has not run, it can not know if it's at the end yet.</div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
| generator |<br class="gmail_msg">
generator := Generator on: [ :g | ].<br class="gmail_msg">
generator next; atEnd<br class="gmail_msg">
"==> true"<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Now the generator has run, so it knows it ended. Unless we solve the Halting Problem we cannot know if the Generator will do another yield or not.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Basically, we need need to call next, and then use atEnd to see if we can use that result or need to ignore it. This is similar to other languages. Here's an example from JavaScript:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><pre class="m_-7438608698541226307gmail-brush: m_-7438608698541226307gmail-js m_-7438608698541226307gmail-line-numbers m_-7438608698541226307gmail-language-js gmail_msg" style="background:url("") 50% 0% rgb(250,251,252);margin-top:0px;margin-bottom:20px;padding:1em 1em 1em 3.8em;border-width:0px 0px 0px 5px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:solid;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:rgb(85,138,187);line-height:1.5;color:rgb(59,60,64);overflow:auto;font-family:consolas,monaco,"andale mono",monospace;direction:ltr;text-align:left;word-break:normal;word-wrap:normal"><code class="m_-7438608698541226307gmail-language-js gmail_msg" style="word-wrap:normal;margin:0px;padding:0px;border:0px;font-weight:inherit;font-family:consolas,monaco,"andale mono","ubuntu mono",monospace;direction:ltr;word-spacing:normal;word-break:normal;line-height:1.5"><font size="1" class="gmail_msg"><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-keyword gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(0,119,170)">function</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-operator gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(166,127,89);background:rgba(255,255,255,0.498)">*</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">foo</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">{</span>
  <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-keyword gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(0,119,170)">var</span> index <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-operator gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(166,127,89);background:rgba(255,255,255,0.498)">=</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-number gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,85)">0</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span>
  <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-keyword gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(0,119,170)">while</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span>index <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-operator gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(166,127,89);background:rgba(255,255,255,0.498)"><=</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-number gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,85)">2</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span>
    <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-keyword gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(0,119,170)">yield</span> index<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-operator gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(166,127,89);background:rgba(255,255,255,0.498)">++</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span>
<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">}</span></font></code></pre><pre class="m_-7438608698541226307gmail-brush: m_-7438608698541226307gmail-js m_-7438608698541226307gmail-line-numbers m_-7438608698541226307gmail-language-js gmail_msg" style="background:url("") 50% 0% rgb(250,251,252);margin-top:0px;margin-bottom:20px;padding:1em 1em 1em 3.8em;border-width:0px 0px 0px 5px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:solid;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:rgb(85,138,187);line-height:1.5;color:rgb(59,60,64);overflow:auto;font-family:consolas,monaco,"andale mono",monospace;direction:ltr;text-align:left;word-break:normal;word-wrap:normal"><code class="m_-7438608698541226307gmail-language-js gmail_msg" style="word-wrap:normal;margin:0px;padding:0px;border:0px;font-weight:inherit;font-family:consolas,monaco,"andale mono","ubuntu mono",monospace;direction:ltr;word-spacing:normal;word-break:normal;line-height:1.5"><font size="1" class="gmail_msg"><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-keyword gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(0,119,170)">var</span> iterator <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-operator gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(166,127,89);background:rgba(255,255,255,0.498)">=</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">foo</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span>
console<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">log</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span>iterator<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">next</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-comment gmail_msg" style="margin:0px;padding:0px;border:0px;display:inherit;color:rgb(112,128,144)">// { value: 0, done: false }</span>
console<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">log</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span>iterator<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">next</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-comment gmail_msg" style="margin:0px;padding:0px;border:0px;display:inherit;color:rgb(112,128,144)">// { value: 1, done: false }</span>
console<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">log</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span>iterator<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">next</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-comment gmail_msg" style="margin:0px;padding:0px;border:0px;display:inherit;color:rgb(112,128,144)">// { value: 2, done: false }</span>
console<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">log</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span>iterator<span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">.</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-function gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(221,74,104)">next</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">(</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">)</span><span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-punctuation gmail_msg" style="margin:0px;padding:0px;border:0px;color:rgb(153,153,153)">;</span> <span class="m_-7438608698541226307gmail-token m_-7438608698541226307gmail-comment gmail_msg" style="margin:0px;padding:0px;border:0px;display:inherit;color:rgb(112,128,144)">// { value: undefined, done: true }</span></font><span class="m_-7438608698541226307gmail-line-numbers-rows gmail_msg" style="font-size:14px;margin:0px;padding:0px;border-width:0px 1px 0px 0px;border-top-style:initial;border-right-style:solid;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:rgb(153,153,153);border-bottom-color:initial;border-left-color:initial;display:block;width:3em;letter-spacing:-1px"><span style="margin:0px;padding:0px;border:0px;display:block" class="gmail_msg"></span><span style="margin:0px;padding:0px;border:0px;display:block" class="gmail_msg"></span><span style="margin:0px;padding:0px;border:0px;display:block" class="gmail_msg"></span><span style="margin:0px;padding:0px;border:0px;display:block" class="gmail_msg"></span><span style="margin:0px;padding:0px;border:0px;display:block" class="gmail_msg"></span></span></code></pre></div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Also, this change set will break existing Generator instances if you load them into your image and it happens to have some.</blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Okay, this is a problem. Maybe a new class?</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Or maybe try to accommodate both - *if* peek or atEnd are called, then compute ahead, otherwise don't... but that might be tricky and confusing.</div></div></div></div></div><div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">- Bert -</div></div></div></div><div class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_-7438608698541226307gmail-HOEnZb gmail_msg"><font color="#888888" class="gmail_msg"><br class="gmail_msg"></font></span><div class="m_-7438608698541226307gmail-HOEnZb gmail_msg"><div class="m_-7438608698541226307gmail-h5 gmail_msg">Bert Freudenberg wrote:<br class="gmail_msg">
<br class="gmail_msg">
<blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hi all,<br class="gmail_msg">
there was an interesting question about Generators on StackOverflow:<br class="gmail_msg">
<br class="gmail_msg">
<a href="http://stackoverflow.com/questions/43340007/yield-prolog-adaptation-for-smalltalk" rel="noreferrer" class="gmail_msg" target="_blank">http://stackoverflow.com/questions/43340007/yield-prolog-adaptation-for-smalltalk</a><br class="gmail_msg">
<br class="gmail_msg">
It's about a pseudo-Prolog implementation using Generators and yield.<br class="gmail_msg">
<br class="gmail_msg">
Our Generator *almost* works for this, except there is a little problem with the timing of side-effects:<br class="gmail_msg">
<br class="gmail_msg">
| x gen |<br class="gmail_msg">
x := 0.<br class="gmail_msg">
<br class="gmail_msg">
gen := Generator on: [:g |<br class="gmail_msg">
x := 1.<br class="gmail_msg">
g yield: nil.<br class="gmail_msg">
<br class="gmail_msg">
x := 2.<br class="gmail_msg">
g yield: nil.<br class="gmail_msg">
<br class="gmail_msg">
x := 3.<br class="gmail_msg">
g yield: nil].<br class="gmail_msg">
<br class="gmail_msg">
gen do: [:i | Transcript cr; show: x].<br class="gmail_msg">
<br class="gmail_msg">
This *should* print '1 2 3' but actually prints '2 3 3'. This is because our Generator is written to support a streaming interface (using atEnd<br class="gmail_msg">
and peek) so it always computes one yield ahead.<br class="gmail_msg">
<br class="gmail_msg">
In other languages (e.g. JavaScript, Python, C#) this is different, the execution is paused at the current yield statement, not 'before' the next<br class="gmail_msg">
one. In general, a generator cannot know if there will be more "yields" without executing more code. In Javascript, 'next' returns both a value<br class="gmail_msg">
and a 'done' flag, and if the flag is true, the returned value must not be used.<br class="gmail_msg">
<br class="gmail_msg">
IMHO we should fix this - see attached changeset Marcel and I came up with. We did not fix the tests yet, but the behavior seems right.<br class="gmail_msg">
<br class="gmail_msg">
Even though generators are in the image for a long time they are not used widely yet (AFAIK) so maybe we can still change the behavior? What do<br class="gmail_msg">
people think?<br class="gmail_msg">
<br class="gmail_msg">
- Bert & Marcel -<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote>
<br class="gmail_msg">
</div></div></blockquote></div></div></div></div>