On Feb 2, 2015, at 9:11 AM, Domenic Denicola wrote:

> I don’t think we should be assuming that an abnormal completion should run 
> anything like the same logic as a normal completion. If I understand 
> correctly, that’s what any proposal to fall back to “close” does.

"close" exists to deal with abnormal loop completion (or consumption 
completion, in general).  A for-of loop only class "close" on its iterator, if 
something happens (exception, return, break) to terminate the loop before its 
iterator is exhausted.  That is exactly what is happening if yield* throws 
because of a "protocol violation" for the situation we are talking about.  
yield*, just like for-of, doesn't call "close" on a normal (the inner iterator 
was exhausted) completion.

Allen

>  
> From: es-discuss [mailto:[email protected]] On Behalf Of Allen 
> Wirfs-Brock
> Sent: Monday, February 2, 2015 12:09
> To: Jason Orendorff
> Cc: es-discuss list; [email protected]; Erik Arvidsson
> Subject: Re: a weird yield* edge case
>  
>  
> On Feb 2, 2015, at 7:26 AM, Jason Orendorff wrote:
> 
> 
> On Sat, Jan 31, 2015 at 10:56 AM, Erik Arvidsson <[email protected]> 
> wrote:
> Another option would be to throw. Then the caller can tell that they did 
> something that was not expected by the inner iterator.
> 
> 
> I agree. In fact, isn't this required by transparency?
> 
> Inner().throw() in this situation would throw a TypeError (since there's no 
> such method). So wrapper().throw() should throw a TypeError.
>  
> Except that a consumer (such as for-of) is expected to check for the 
> existence of 'throw' before trying to invoke it.  That's really where the 
> transparency is lost in this case.
>  
> But I agree that throwing to indicate a "protocol violation" seems like a 
> good approach.  but it could mean that Inner doesn't get properly "closed".  
> How how about this variation:
>  
> 2a) An TypeError exception is thrown, but first 'close' (if it is present) is 
> invoked on the yield* target iterator. 
>  
> That would seem to both satisfy the 'close' contract (a consumer (in this 
> case yield*) calls it if is terminating its use of an iterator before the 
> "done" state is reached) and produces an exception to the wrapper consumer 
> for the "throw" protocol violation.
>  
> Allen
>  
>  
>  
>  
>  
>  
>  
> 
> 
>  
> -j
> 
>  

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to