On Apr 18, 2010, at 3:56 AM, Peter van der Zee wrote:

On Sun, Apr 18, 2010 at 7:19 AM, Brendan Eich <[email protected]> wrote:
On Apr 17, 2010, at 6:07 PM, Peter van der Zee wrote:

To be solved:
- Allow non-string-property keys
- Allow "hidden" properties, non-enumerable, not generically accessible (like stringed keys are now). To be honest, I'm still not 100% clear on this one.

I don't see how these two differ.

Non-string property keys don't need to be hidden. The language could be extended in such a way where identity properties could be part of it. They could be enumerable. Some edge cases would have to be resolved of course.

Existing code containing for-in loops over objects that could be passed in as arguments, or found in the heap, where the objects could now have object-keyed properties, would break if the keys were not converted to strings. But of course if converted to string, an object key would lose its identity and potentially collide, and in any event not name the same property it did. for-in loop bodies often use the enumerated key:

  for (var prop in obj) alert(o[i]);
  for (var prop in obj) assert(typeof prop == "string");
  for (var prop in obj) if (obj.hasOwnProperty(prop)) alert(prop);

etc.

This gets back to versioning. If you assume we can make incompatible changes to the language, say under opt-in versioning, then there's still the problem of mixed versions of code interacting via the heap (shared function references allowing new objects to be passed to old functions, or just found in the heap by old functions via the global object or some other shared mutable object).

These are not "edge cases". They suggest keeping any new object-keyed properties non-enumerable by definition, with no way to make such new properties enumerable. This then leads to the observations about garbage collection, equivalence with inverting obj[prop] to prop.get(obj) where prop is an EphemeronTable, etc.


The hidden properties could just as well be strings. You could have a public enumerable property and one that's private and hidden at the same time.

If both are string-keyed, how would you access both from within the "private" boundary? There would still be one bit of difference between the keys. I'm not soliciting a full proposal from you here, just suggesting this is not a clear enough proposal to evaluate.


I can see these as distinct, That's why I'm wondering whether everyone is trying to solve one with the other or actually pursuing either one (or both) of them.

The names proposal has advantages beyond what a "private string" key idea could have, if there were a way to forge or equate the private string key. Names can't be forged.

If the private string key idea is indistinguishable with the Name object idea, then we are in agreement. The use of "object" in "Name object" is a straw concept currently. Perhaps there should be a new typeof result. I addressed this issue here:

"We have extant implementations and real code on the Web that assume o[x] will convert an object denoted by x to its string representation via [[DefaultValue]] (typically, toString) and use that string to identify the property of o. Changing the rules by making Name instances be of object type (“object” typeof result, Object type name in ECMA-262) breaks this contract. There is no string conversion of a Name instance that can be used to identify the property named by that instance in an object. Names are different animals from strings and objects. Their type (typeof and abstract specification type) must make this clear."


This could be fixed by some kind detection scheme for these directives.

You can't detect new syntax except by embedding it in a string and eval'ing the string inside a try/catch.


But why was versioning going to be a problem at first and not any more?

Because old browsers fade away. IE6 is taking its time but it will go away too. More modern browsers all auto-update, crucial for patching security bugs and promoting new versions to users who might otherwise get stuck at a buggy, unsafe old rev.



Harmony having new syntax does not mean we are opening up the design space to make some new, incompatible version of the language. You seem to allow for that as a possible future course, but TC39 members are uniformly against this path AFAICT. See http://wiki.ecmascript.org/doku.php?id=harmony:harmony .

/be

That was my proposal indeed. This also makes it impossible for introducing any and all kind of feature that would not be parsable by previous versions (like introducing new characters or the short function notation). It actually puts a great burden on the evolution of the language as a whole, doesn't it? Not sure whether that's a bad thing per se.

The burden comes from the Web as it is, in my view. We don't get to start over. The decision whether or not to make a new and more freely incompatible variant of JS is, you're right, a choice. TC39 does not propose such a large change. It is likely to be bad for implementors and users. It would probably not converge in a usable new spec, based on design-by-committee. The odds of a market player evolving some new and more incompatible version is even lower.

The best course in TC39's view, I think I can safely say, is to extend the language in ways that address design flaws and gaps, and remove flawed constructs only after they fall into disuse. It is the extension via new syntax, more than extension of standard objects (but both can matter), that motivates this versioning discussion. And of course this gets back to the thread's topic: why did ES5 add "static methods" to Object.

I hope this helps clarify things.

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

Reply via email to