On Feb 2, 2012, at 1:38 PM, Brendan Eich wrote:

> Allen Wirfs-Brock wrote:
>> On Feb 1, 2012, at 7:13 PM, Brendan Eich wrote:
>>> ...

Unfortunately, having thought about it a bit since the meeting, I'm less 
convinced. We didn't look too deeply at possible capture scenarios such as:

let geti;
for (let i=(geti = function() {return i},expr), expr, incr = function(i++), 
decr=function(i--), cmp=function(){return i<n}; cmp();incr()) {
       let j=i;
       i +=10;
       decr();
       ...
       If (j+-9 !== i) ...
       ...
}

>> ...
> 
> keys etc. are currently spec'ed to to do own-only, you want allKeys to do the 
> crazy thing:
> 
> http://wiki.ecmascript.org/doku.php?id=harmony:iterators#standard_api
> 
> Let's not go around and around on this. Enumerable proto-properties are 
> harmful, no one wants them.

I'm afraid I have to disagree with the absolutism of this statement.  There are 
some perfectly reasonable use cases for enumerating proto properties and they 
are quite in alignment with prototypal inheritance.  For example, how about 
defining a set of default property values and then using prototypal inheritance 
to selective over-ride them:

let privateImplicitOptions = {a:1,b:2,c:3 /* and on and on */};

function makeOptions(explicitOptions) {
    let opt = Object.create(privateImplicitOptions);
    for (let [k.,v] of items(explicitOptions)) opt[k]=v;
    return opt;
}

myOpts = makeOptions({b:-2});

Why should somebody I pass an options object to need to worry about whether I 
used zero, one, or n levels of prototypes to represent by options.

that said, I think we agree that the real problem is the legacy ES semantics of 
for-in and its use (or lack of) for the enumerable attribute. If we can start 
out with a clean slate conceptual slate for for-of maybe we don't have to worry 
about such things.  However, carrying over a lot of historic baggage isn't a 
clean slate.  Thinking in terms of abstract collections, having keys() not mean 
"all keys in the collection" seems quite absurd.  That should be the normal 
case, the more verbose name should be used for the exceptional case that 
excludes some of the keys.  Now in this case, the real problem is in deciding 
the default way to view a plain Es objects as an abstract collection. Maybe 
only considering own properties  as the collection elements is the right thing. 
 In that case it may be "allKeys" that is carrying the wrong implication and 
instead it should be something like "extendedKeys".

> ...
> 
>> Presumably, the only prior leaning that applies comes from CoffeeScript.  
>> While CS is popular, it isn't at all close to being used by the majority of 
>> JS developers.  CS experience is informative but I don't think we have to 
>> worry so much about CS derived habits.
> 
> It's informative, agreed, and competitive -- my point. TC39 does poorly 
> inventing new and untested API. We do better paving cowpaths. I think we 
> should be careful not to get too far ahead of de-facto standards, while 
> avoiding being hostage to language design flaws from the past. We also should 
> not oversell Smalltalk, etc. -- Smalltalk is informative (your collections 
> port especially) but not particularly more important (or less) than CS.

Totally agree concerning Smalltalk  other languages.  However, when we are 
looking to extend into new areas it makes sense to look at languages that excel 
in those areas. We're talking about making ES a better to define object-based 
abstractions and in specifically in this thread collection abstractions. That 
is an area where we can learn a lot from Smalltalk.
> 
> ...
> 
>> There is still a default.  The iterators proposal says that for-of falls 
>> back to @enumerate if @iterate isn't present.
> 
> That's a proxy trap, and I believe that dates from before for-of. We need to 
> revisit this now, based on splitting iteration out to for-of and leaving 
> for-in the old enumerating mystery meat that it has always been. Cc'ing Tom.
> 
> It's important to distinguish property default from proxy trap built-in.

Not sure, I understand why.  Presumably the default behavior of a proxy trap 
should be the same as the built-in behavior.  The internal methods (which need 
to be extended to include things like [[Interator]]) have a specification for  
"normal" objects and an alternate one for Proxy objects that just invokes the 
trap.  However, the default traps handlers should be specified to turn around 
and invoke the corresponding "normal" internal method.

> 
> If there's an Object.prototype.@iterator that iterates values, or [key,value] 
> pairs, or whatever, then we make it hard for new collections and set-like 
> abstractions to do something slightly different.

I don't see where the hardness comes from.  They just need to define an 
appropaite @Interator method. They are going to have to do so regardless of 
whether a default @Iterator is defined on Object.prototype or whether the 
default is just hardwired (for example to throw).  In either case the default  
needs to be over-ridden.
> 
>> BTW, this is a good example of something that should not be built into 
>> statement semantics.  Why should |for (v or values(o))...| iterate 
>> differently than |values(o).forOf({|v|...})|
> 
> Do you mean forEach?

No, I'm hypothesizing a new method that mimics for-of iteration. 
> 
> Who says values(o) returns an array? That is costly and the point of 
> iterators is to use a lazy protocol. Indeed the

I wasn't implying that at all.  My point is that we want to able to easily 
write functions that do the same style of iteration as for-of.  Placing 
essential pieces of the for-of semantics (such as calling [[Enumerator]] if 
[[Iterator]] is not defined) into the evaluation algorithm of the for-of 
grammar production is not a good factoring from this perspective.

> 
> http://wiki.ecmascript.org/doku.php?id=harmony:iterators#standard_api
> 
> proposal has values a generator (returns an iterator).
> 
>> My currently thinking (working off of the current wiki proposal) is to have 
>> [[Enumerate]] and [[Iterate]] internal methods (for all objects) and it is 
>> in their default implementation that [[Iterate]] delegates to [[Enumerate]].
> 
> No, see above. We do not want to mix these up. Iteration via for-of uses the 
> iteration protocol.
> 
>>> No issue here, I think. We want for (x of {p:1, q:2}) to throw, without the 
>>> user first having defined @iterator in Object.prototype (and that would not 
>>> be recommended practice).
>> 
>> Not what the wiki proposal currently says...
> 
> Where? 

http://wiki.ecmascript.org/doku.php?id=harmony:iterators#evaluation_of_for-of_loops
 

but you're right the part of the algorithm I was looking at is clearly 
obsolete.  At this point, I think I'm probably better off just writing the 
for-of spec. from scratch.  It's actually pretty simple, it just calls the 
[[Iterate]] internal method to get a iterator instance and then has be boil 
plate to of looping using tht iterator.  All the defaults, @iterator overrides, 
proxy support, etc is taken care of via [[Iterate]]


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

Reply via email to