Le 13 juin 2013 à 03:33, Brendan Eich <[email protected]> a écrit :
> Andreas Rossberg wrote: >> On 12 June 2013 23:27, Claude Pache<[email protected]> wrote: >>> Therefore, I think that "For/of coerces its argument to an iterator" is a >>> wrong mental model, and "For/of accepts either a reusable iterable or a >>> disposable iterator" is a better one. And the implicit invocation of >>> `@@iterator` is better thought as Get-the-snark-I-need-for-doing-my-work, >>> than as Coerce-to-a-disposable-object. (And the fact that iterators are >>> also non-reusable iterables is an implementation detail that don't disturb >>> my mental model, because I don't care, thanks to generators.) >> >> In other words, you want to program with iterables. That is a >> perfectly reasonable thing to want. But unfortunately, with the >> current intermingled protocol, there is no particularly useful >> contract of what an iterable actually does (i.e., where the state >> goes). > > No, the contract is perfectly useful and minimal. An array is iterable, it > has @iterator. Yes, the name of the contract is `@@iterator`. A for/of loop is normally used to loop over an entire collection of items, so it is expected that the user provides an object from which one could extract a fresh (i.e. non-consumed) iterator. In order to enforce that requirement, one could ask iterators to remove or poison-pill its own `@@iterator` method as soon as its `next` method is called. *That* would add extra value (better error-checking) to the programmer, if we find it worth. But replacing `@@iterator` with `ToIterator` is mostly changing an implementation detail. > >> Consequently, if you want to write abstractions, you will >> likely be better off basing them on iterators, and leave iterables as >> a mere convenience mechanism for for-of loops over concrete objects. > > This does not follow. It flies in the face of boatloads of experience with JS > and Python (itertools and beyond). > > I guess we are going 'round the assertion block. I've seen that building > before :-|. > > /be If I want to write an abstraction in a library which loops over an entire collection (e.g,, an `Iter.reduce` function), I just invoke the `@@iterator` method to get an assumed fresh iterator (and it is the responsibility of the user to not provide me with a consumed or half-consumed iterator, unless we add the error-check I mentioned above). If we replace the `@@iterator` method call by an abstract `ToIterator` or `GetIterator` operation, there should be a, say, `Reflect.ToIterator` function that I could use in my library code. ―Claude _______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

