Another option would be to throw. Then the caller can tell that they did something that was not expected by the inner iterator.
On Sat, Jan 31, 2015, 08:43 Salvador de la Puente González < [email protected]> wrote: > From my point of view, it should do nothing if there is no throw() method > to call. The problem you are pointing is worthy to be noted but is a > problem for the implementer. > El 31/01/2015 04:29, "Allen Wirfs-Brock" <[email protected]> escribió: > > Generally, we want yield* to be as transparent as possible, so that if we >> have a Iterable Inner and a generator defined like: >> >> function *wrapper() { >> yield *Inner(); >> } >> >> any sequence of next/throw/return method calls on an iterator produced by >> wrapper will generate the same results as if the same sequence of method >> calls had been directly applied to the Inner iterator instance that is >> wrapped. >> >> And this generally works (or at least will after I finish fixing some >> bugs) if wrapper and Inner are both generators. But here is the edge case >> where it appears impossible to achieve full transparency. >> >> Generators always[*] have both a "return" and "throw" method and >> everything works transparently as expected. However, if the iterator >> returned by Inner is not a generator object, it might not have a "throw" >> method but still have a "return" method. Normally a "throw" to such a >> wrapper iterator would be forwarded by yield* to the inner iterator's throw >> method, presumably triggering any "finalization" processing needed by the >> inner iterator. However, yield* can't forward the the throw to a >> non-existent inner "throw" method. But the existence of a "return" method >> is a strong hint that the inner iterator may have some "finalization" it >> should be given an opportunity to perform. >> >> It seems like, there are two plausible semantics for this case, each with >> an undesirable characteristic: >> >> 1) yield* doesn't invoke anything on the inner iterator in this >> situation. Transparency is preserved, but the inner iterator may have >> "finalization" processing that never gets executed >> 2) yield* invokes "return" on the inner iterator in this situation. >> Inner iterator gets a chance to run its "finalization" processing. But >> full transparency is lost as a method is invoked on the inner iterator that >> that would not have been invoked with the wrapper wasn't sitting in the >> middle. >> >> (Note that wrapper already isn't truly transparent, because it is >> exposing a "throw" method that doesn't exist on the iterator iterator. >> It's possible, that the visibility of the "throw" method is what caused >> the consumer to invoke it, rather than invoking the "return" method.) >> >> So, opinions on which of these alternatives is better? Are there any >> others? >> >> Allen >> >> [*] this situation actually can occur when Inner is also a generator, but >> it requires over-riding the 'throw' method for that generator's instance >> with undefined. >> _______________________________________________ >> es-discuss mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/es-discuss >> > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

