<html><head><style data-externalstyle="true"><!--
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
}

p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst, p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle, p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
line-height:115%;
}
--></style></head><body><div data-externalstyle="false" dir="ltr" style="font-family:Calibri,'Segoe UI',Meiryo,'Microsoft YaHei UI','Microsoft JhengHei UI','Malgun Gothic','Khmer UI','Nirmala UI',Tunga,'Lao UI',Ebrima,sans-serif;font-size:12pt;"><div>I know pretty well I’m probably not going to convince the believers here, but this whole “we need an indication at the beginning of the function” thing is kinda not making sense.</div><div> </div><div>For starter, the generator function always starts at its first line. If what you {Till Schneidereit} mean is that the execution can resumes at another line when someome call .next() on the iterator, then we speak about something else, which is absolutely no different than</div><div> </div><div>function SomeIterator() {</div><div>     </div><div><div>     function onFirstCalll(v) {</div><div>         </div><div>         // continue execution</div><div>         ...</div><div> </div><div>         // next step in generator</div><div>         resumeDoSomething = onSecondCall;</div><div>         return someYieldedValue;</div><div>         </div><div>     }</div><div> </div><div>     function onSecondCall(v) {</div><div>         </div><div>         // continue execution</div><div>         ...</div><div>         </div><div>         // next step in generator</div><div>         resumeDoSomething = onExtraCall;</div><div>         return someYieldedValue;</div><div>         </div><div>     }</div><div> </div><div>     function onExtraCall() {</div><div>         throw new Error(“The iterator cannot yield more values”)</div><div>     }</div><div>     </div></div><div><div>     // generator boilerplate</div></div><div>     var resumeDoSomething = onFirstCalll;</div><div><div>     return { </div><div>         next: function next(v) { </div><div>              return resumeDoSomething(v);</div><div>         },</div><div>         ...</div><div>     };</div></div><div>     </div><div>}</div><div> </div><div>for which there’s no specific indication required. As noted before in the discussion, most programming languages providing “yield” support do not require anything specific to support it. Interestingly, VB.NET is not one of those, but they deliberately choose some non-function syntax fwiw.</div><div> </div><div>In all honesty, Async functions and Promise-returning functions can very often be more challenging to grasp than iterators and there’s no “syntax flag” for those things. </div><div> </div><div>The best way to tell what your function does is to choose a name that makes clear how its internal working behaves, and possibly some informational return-type information (via a comment or Typescript-like preprocessors), not by adding a distracting and non-self-descriptive star symbol next to the function keyword.</div><div> </div><div>Also, I totally dislike the fact I can’t use “yield” in a lambda function because of this star thing. I can totally imagine a function taking an iterator as argument, and being able to use a lambda function could totally make sense to define the iterator. The star syntax is an arbitrary and not very useful restriction, in my opinion.</div><div> </div><div> </div><div data-signatureblock="true"> </div><div style="padding-top: 5px; border-top-color: rgb(229, 229, 229); border-top-width: 1px; border-top-style: solid;"><div><font face="Calibri, 'Segoe UI', Meiryo, 'Microsoft YaHei UI', 'Microsoft JhengHei UI', 'Malgun Gothic', 'Khmer UI', 'Nirmala UI', Tunga, 'Lao UI', Ebrima, sans-serif" style='line-height: 15pt; letter-spacing: 0.02em; font-family: Calibri, "Segoe UI", Meiryo, "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Khmer UI", "Nirmala UI", Tunga, "Lao UI", Ebrima, sans-serif; font-size: 11pt;'><b>De :</b> Till Schneidereit<br><b>Envoyé :</b> ‎samedi‎ ‎31‎ ‎août‎ ‎2013 ‎18‎:‎05<br><b>À :</b> Brendan Eich<br><b>Cc :</b> es-discuss</font></div></div><div> </div><div dir="ltr">On Sun, Sep 1, 2013 at 2:43 AM, Brendan Eich <span dir="ltr"><<a title="mailto:brendan@mozilla.com" href="mailto:brendan@mozilla.com" target="_parent">brendan@mozilla.com</a>></span> wrote: <div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div class="im"> </div>
Lots of constructors/factories out there. An essential (see Aristotle) argument for why function* for generator syntax (ignoring trumping reasons 1&2) must say why *this* particular factory needs special (a la function*) head syntax.<div class="im">
<br></div></blockquote><br></div><div class="gmail_quote">For all non-generator functions, one important assumption for reading them holds: they always start with the first instruction, and any (potential) deviations from linear control flow are visible exactly where they (might) happen. Not so for generators: to understand what invoking a generator might do, you have to look at all the potential entry points, i.e., all instructions following a yield in the control flow. If you want to do more localized reasoning and are interested in a specific invocation, you also have to reason about which might be the relevant one. Granted, that is essentially state and any function's control flow can be state-dependent, so this point might be less important.<br>
<br>Still, having to look at an unknown number of entry points to understand how control flows through a piece of code seems like something you'll want to know about. Without searching the code for "yield".<br>
</div></div></div>
</div></body></html>