April 10 2014 Meeting Notes

Brendan Eich brendan at mozilla.org
Sat Apr 26 09:59:58 PDT 2014

Kevin Smith wrote:
>     In this case we have try-finally statements as an existing
>     feature.  The semantics of this feature is a bounded execution
>     scope with a cleanup action on completion. This feature is widely
>     used and has always been internally consistent and reliable,
>     expect for catastrophic external failure or intervention (ie,
>     externally imposed process termination, power failure, etc).
>      People use it for all sorts of things, including bounded resource
>     management.
> Zeroing in on "cleanup action on completion":  don't co-routines by 
> nature prohibit us from reasoning in this way about completion?  It 
> seems to me that this shift is broader than just `try/finally`, 
> although I agree that `try/finally` shows some particularly acute 
> symptoms.
> And I also agree that we should not provide gratuitous footguns. 
>  Unfortunately, though, I'm having a hard time forming an opinion on 
> how disallowing `try/yield/finally` would balance out.

We're at risk of going around the design wheel again.

Python started by banning yield in try: and then added it, with 
GeneratorExit as a magic exception thrown from Python's 
implicitly-called generator.close method at a yield-in-try that would 
run the finally clauses.

When Igor Bukanov and I were working on ES4 and prototyping it in 
SpiderMonkey, Igor urged forcing a return instead of throwing a magic 
exception. He even persuaded Philip J. Eby on python-dev that forcing 
return was better, possibly even for Python (which IIRC then went in the 
direction of reifying control effects as exceptions).

Instead of kicking the can and dragging this out yet again, I'm ok with 
return automation as proposed. Yeah, we're doing a common-ish use-case 
affordance. No, it isn't the last case where scoped resource release 
will come up. But yes, it has precedent in other languages and it's useful.

BTW Dave Herman persuaded me we don't need to use a symbol for the name; 
'return' is ok if 'next' is. The iteration protocol hooks via 
@@iterator, which returns an instance of something coded  new 
implementations, so implementors can avoid using 'return' for a 
different purpose without conflict. IOW, one symbol-name is enough!


More information about the es-discuss mailing list