<div dir="ltr">IMO the yields should be literally *in* the return type. The present state of things is<div><br></div><div>fn countToTen() -&gt; CountToTenGenerator</div><div><br></div><div>Generator functions are normal functions. What is special about them is that instead of returning a named type such as &quot;CountToTenGenerator&quot;, the compiler replaces the return type with an anonymous type conforming to GeneratorType. So conceptually it&#39;s the return type that is special, not the function.</div><div><br></div><div>Try either one of these for size</div><div><br></div><div><div><div><div><div>fn countToTen() -&gt; yields Int {</div></div><div>fn countToTen() -&gt; yields&lt;Int&gt; {</div></div></div><div><br></div><div>- Alex</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Dec 12, 2015 at 3:17 AM, Joe Groff via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Dec 11, 2015, at 6:26 PM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Eh, I was trying to avoid grabbing another keyword, but I guess it&#39;s context-sensitive anyway.</div></div></blockquote></div><br><div>I&#39;ve thought about this some. It might not have to be a keyword, if this were a generalized language feature. Anything that interrupts control flow and optionally resumes it later, such as &#39;throws&#39;, &#39;yields&#39;, and potentially also &#39;async&#39;, could be implemented as instances of algebraic effects. As a rough sketch of an idea, you could declare an effect and its operations:</div><div><br></div><div>effect throws { @noreturn operation throw (ErrorType) -&gt; () }</div><div>effect yields&lt;T&gt; { operation yield (T) -&gt; () }</div><div>effect awaits { operation await&lt;T&gt; (Promise&lt;T&gt;) -&gt; T }</div><div><br></div><div>and &#39;catch&#39; could be generalized to let you handle any effect operations that might be performed in the body of a block:</div><div><br></div><div>class Generator&lt;T&gt; {</div><div><span style="white-space:pre-wrap">        </span>var generator: () yields&lt;T&gt; -&gt; ()</div><div><span style="white-space:pre-wrap">        </span>func next() -&gt; T? {</div><div><span style="white-space:pre-wrap">                </span>do {</div><div>  <span style="white-space:pre-wrap">                        </span>generator()</div><div><span style="white-space:pre-wrap">                        </span>return nil</div><div><span style="white-space:pre-wrap">                </span>} catch yield (let x) {</div><div><span style="white-space:pre-wrap">                        </span>generator = currentContinuation</div><div><span style="white-space:pre-wrap">                        </span>return x</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div>}</div><div><br></div><div>See Eff (<a href="http://www.eff-lang.org" target="_blank">http://www.eff-lang.org</a>) for an example of a language with this already implemented.</div><div><br></div><div>-Joe</div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=ufQ1sKmNNtjEC-2BBUON-2BgZPd8t-2F4PFTin0qlI9lRM0AnYWfPJx9MdrGP2MyJiuvNNJfgCjcQYQF66UTHp3zeXCancTzUtH0fvnWnk5CCz631pBC466usXVjp5YpiuwopqWj6-2B8J-2BkQk-2BxKHMaBkE8fLRqEq05VrZdRtUpR9gzRuWaDyWzW6G5uX0bsNnUSwlzwta1vE0QfLVCdGyYIbA-2FzmyjvmOUuePIeVb4CkYhg1Y-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
</div>
<br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div>