<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 11, 2015, at 6:26 PM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Eh, I was trying to avoid grabbing another keyword, but I guess it's context-sensitive anyway.</div></div></blockquote></div><br class=""><div class="">I'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 'throws', 'yields', and potentially also 'async', 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 class=""><br class=""></div><div class="">effect throws { @noreturn operation throw (ErrorType) -&gt; () }</div><div class="">effect yields&lt;T&gt; { operation yield (T) -&gt; () }</div><div class="">effect awaits { operation await&lt;T&gt; (Promise&lt;T&gt;) -&gt; T }</div><div class=""><br class=""></div><div class="">and 'catch' could be generalized to let you handle any effect operations that might be performed in the body of a block:</div><div class=""><br class=""></div><div class="">class Generator&lt;T&gt; {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>var generator: () yields&lt;T&gt; -&gt; ()</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>func next() -&gt; T? {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                </span>do {</div><div class="">&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">                        </span>generator()</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>return nil</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                </span>} catch yield (let x) {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>generator = currentContinuation</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>return x</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div class="">}</div><div class=""><br class=""></div><div class="">See Eff (<a href="http://www.eff-lang.org" class="">http://www.eff-lang.org</a>) for an example of a language with this already implemented.</div><div class=""><br class=""></div><div class="">-Joe</div></body></html>