<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hello,<div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">Am 22.08.2017 um 18:32 schrieb Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;:</div></blockquote><blockquote type="cite" class=""><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="">The feature provides general delimited continuations. You could write an IteratorProtocol-conforming interface over a coroutine like this:</div><div class=""><br class=""></div></div><blockquote class="" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px 0px 0px 40px; border: none; padding: 0px;"><div class=""><div class="">&nbsp;private func yield(_ value: T) async -&gt; Void {</div></div><div class=""><div class="">&nbsp; &nbsp;self.next = value</div></div><div class=""><div class="">&nbsp; &nbsp;await suspendAsync { cont in</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp;resume = cont</div></div><div class=""><div class="">&nbsp; &nbsp;}</div></div><div class=""><div class="">&nbsp;}</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><br class=""></div></div></blockquote><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">This isn't ideal in a number of ways (awkward, not particularly efficient, and has the gotcha that the generator's `body` could suspend itself with something other than the `yield` operation, doesn't integrate with ownership in the way John proposes in the ownership manifesto), so it may not be a good idea, of course.</div></blockquote><div><br class=""></div><br class=""></div>I still have trouble understanding how exactly suspendAsync is going to work.<div class="">Is the body called right away or is it put into some dispatch queue on another thread?</div><div class="">Does the continuation function return immediately (besides queueing suspendAsync to also return)?</div><div class=""><br class=""></div><div class="">How does this correlate with coroutines?</div><div class="">There is no extra stack for the coroutine (which runs the generator function), right?</div><div class="">In my mental model, the generator function is split into individual functions which are queued one after another, but reusing the same thread/stack, is this correct?</div><div class=""><br class=""></div><div class="">How would a generator feature without the mentioned shortcomings look like?</div><div class=""><br class=""></div><div class="">Thanks for any help in understanding how it works!</div><div class="">And thanks for all the great work, this looks like a nice basis for future Swift :-)</div></div><div class=""><br class=""></div><div class="">— Martin</div></body></html>