Check out Dart's iterators
David Bruant
bruant.d at gmail.com
Sun Feb 10 13:01:35 PST 2013
Le 10/02/2013 20:55, Oliver Hunt a écrit :
> Just a couple of questions on this wonderous topic:
>
> * how is 'e instanceof StopIteration' intended to work across multiple global objects?
StopIteration has a special "StopIteration" [[Brand]] [1], so the
cross-global story shouldn't be a problem for the for-of loop.
Exposing the brand can solve the problem for manual use of iterators.
(you'd check if the object has a particular brand instead of "e
instanceof StopIteration").
StopIteration could also be a deeply frozen constructor with same
identity across globals.
> * how firmly are we wedded to this? I can't imagine there is too much code that currently depends on manually catching StopIteration given ES6 is not finalized yet, and iterators aren't widely available.
>
> I do dislike the exception based termination, I _think_ i'd prefer next() and hasNext() style iteration over exceptions, especially given that for the most part these are hidden by clean syntax.
The "for the most part these are hidden by clean syntax" argument
applies to throwing StopIteration too, no?
> My personal concern with all of these is how they deal with nested iterators.
I don't see the concern. Can you provide a use case/code sample where
nested iterators would be a problem?
I have to note that there is a minor security hazard in code using
iterators naively:
import process from "m";
var a = [1, 2, 3, 4, 5];
var next = 0;
var it = {
next: function(){
if(next < a.length){
// If the call to "process" throws StopIteration
because it's malicious/buggy,
// so does this code and that's largely unexpected.
return process(a[next++]);
}
else{
throw StopIteration;
}
}
}
You can always protect yourself by wrapping the call to "process" with a
try/catch block.
I'm still on the side of preferring "throw StopIteration" for its better
readability compared to "return false". Dart has "implements
Iterator<T>" to help, but JavaScript doesn't.
David
[1] http://wiki.ecmascript.org/doku.php?id=harmony:iterators
More information about the es-discuss
mailing list