On Jan 11, 2014, at 11:21 AM, David Bruant wrote:

> Hi,
> 
> I'm starting a documentation on the iterator protocol and wanted to ask a few 
> things just to be 100% sure, because some things may leave room to 
> ambiguities.
> 
> ## Just for confirmation
> 
> First, on the relevant TC39 meeting notes [1]. It is suggested that "Without 
> Brendan, a champion of iterators and generators, don't have full consensus". 
> Later notes don't come back to this, so I imagine Brendan agrees (upon 
> confirmation, I'll PR the meeting notes to reflect this for future readers).
> 
> 
> ## Iterator protocol next signature.
> 
> The meeting notes suggest the following signature for next:
> next: () -> {done: boolean, value?: any}
> (it's not clear if it's the iterator protocol or generator.next signature)

they're the same because a generator is just a specialized iterator

> 
> However, in the current draft, the IteratorNext operation takes a value 
> argument as passed it to the call to .next.
> Also, although ES6 will not make use of that, it's possible for 
> user-generated iterators to accept any number of arguments.

See definition of Iterator Interface 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-iterator-interface and 
in particular the the note about arguments. Iterators that accept arguments 
should document they meaning of the arguments.  For an iterator to work in a 
generic iteration context such as a for-of statement it must be prepared to 
deal to being called with no arguments.  (I'll update the note to make that 
last point clearer)

IteratorNext is a specification device that is only directly used to specify 
yield * where a value is explicitly passed to the next method

IteratorNext is also indirectly used when IteratorStep is called.  IteratorStep 
is the specification device that is used in all other places within the 
specification to invoke the next method of an iterator. IteratorStep currently 
accepts a value argument but it is never called with it in the ES6 spec so I'll 
remove the IteratorStep value argument from the draft. 

As the spec. is currently written, if no value is provided, IteratorNext passes 
undefined as the sole argument to the next method.  This is very slightly 
different semantically from not passing any argument.  I'll tweak the spec. to 
actually pass no arguments if no value is provided.

> Also, the IteratorComplete seems to survive if there is no "done" property 
> returned (interpreted as done: false obviously).

Not sure what you mean by "survive"?  IteratorComplete is another internal 
specification device that converts a IteratorResult object to a boolean value 
by doing a truthly test on the result of a Get of the "done" property.  So, yes 
a missing 'done' is interpreted as false.

I would expect that in may cases people writing JS code will just return 
{value: whatever} as an IteratorResult on code paths where they know the 
iteration is complete and {done: true} for signal completion of an iterator.

I'll add a note to 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-iteratorresult-interface
 


> In the end, it looks like the broader signature of user-created iterators is 
> something like:
> next: (value?: any, ...extraArgs) -> {done?: boolean, value?:any}

essentially, of course any JS function will accept extra arguments and an 
IterationResult object may have additional properties.

> 
> The language will never make use of the extra arguments, but user-defined 
> sub-protocols might. The generator protocol does use the first argument if 
> the generator body does.

hard to say about "never" but currently extra arguments are not used by the 
language.

> 
> > Always has an own property called "value"

Right, the current spec. doesn't require that "value" be an own property or 
even test for it's existence if "done" is truthy.  Either would seem like 
unnecessary and wasted computational cycles.  Everything works fine without it.

> 
> To answer my above question, it looks like the .next signature agreed upon is 
> neither the iterator protocol (which seems effectively broader), not the 
> generator one, which as quoted always have an own value property.
> 

Well, that I the spec. says.  People are free to argument for a change.

As a general comment, things document in TC39 meeting notes are seldom 
comprehensive enough to be considered a detailed spec.  They are typically just 
a starting point from which write real spec. language that includes all the 
edge cases.  It's good for people to review the actual spec. (like David in 
this case) because what's in it is what is going to be the standard unless 
somebody calls attention to an issue.

Allen

> David
> 
> [1] 
> https://github.com/rwaldron/tc39-notes/blob/master/es6/2013-03/mar-12.md#conclusionresolution-1
> _______________________________________________
> 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

Reply via email to