[swift-evolution] Proposal: Add generator functions to the language

Joe Groff jgroff at apple.com
Fri Dec 11 21:17:19 CST 2015


> On Dec 11, 2015, at 6:26 PM, Jordan Rose via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Eh, I was trying to avoid grabbing another keyword, but I guess it's context-sensitive anyway.

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:

effect throws { @noreturn operation throw (ErrorType) -> () }
effect yields<T> { operation yield (T) -> () }
effect awaits { operation await<T> (Promise<T>) -> T }

and 'catch' could be generalized to let you handle any effect operations that might be performed in the body of a block:

class Generator<T> {
	var generator: () yields<T> -> ()
	func next() -> T? {
		do {
  			generator()
			return nil
		} catch yield (let x) {
			generator = currentContinuation
			return x
		}
	}
}

See Eff (http://www.eff-lang.org) for an example of a language with this already implemented.

-Joe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151211/73ab3cf9/attachment.html>


More information about the swift-evolution mailing list