On Jul 8, 2011, at 2:43 PM, Andreas Rossberg wrote:
> One minor suggestion I'd have is to treat names as a proper new
> primitive type, i.e. typeof key == "name", not "object". That way, it
> can be defined much more cleanly what a name is, where its use is
> legal (as opposed to proper objects), and where it maybe enjoys
> special treatment.
We went back and forth on this. I believe the rationale is in the wiki (but
perhaps in one of the strawman:*name* pages). There are a couple of reasons:
1. We want private name objects to be usable as keys in WeakMaps. Clearly we
could extend WeakMaps to have either "object" (but not "null") or "name"
typeof-type keys, but that complexity is not warranted yet.
2. Private name objects are deeply frozen and behave like value types (since
they have no copy semantics and you can only generate fresh ones). Thus they
are typeof-type "object" but clearly distinct from string-equated property
names that JS has sported so far.
In other words, we don't gain any distinctiveness, or make any particular
claims about private name objects that could not be made about other
(deeply-frozen, generated-only, say by Object.create or Proxy.create in a
distinguished factory function) kinds of objects, via a new typeof-type.
In light of these points, making private names be "objects" in both the
as-proposed WeakMap sense, and the typeof-result sense, seems best.
So, while we have added "null" as a new typeof result string, and we have
considered adding other novel typeof results, and we believe that we can add
new typeof results with good enough reason (thanks to IE adding some
non-standard ones long ago, and programmers tending to write non-exhaustive
switch and if-else "cond" structures to handle only certain well-known typeof
cases), in the case of private name objects, we don't think we have good enough
reason to add a typeof name -- and then to complicate WeakMap.
>> Point = {
>> //private members
>> [__x]: 0,
>> [ __y]: 0,
>> [__validate](x,y) { return typeof x == 'number' && typeof y =
>> 'number'},
>> //public members
>> new(x,y) {
>> if (!this[__validate](x,y)) throw "invalid";
>> return this <| {
>> [__x]: x,
>> [__y]: y
>> }
>> };
>> add(anotherPoint) {
>> return this.new(this[__x]+another[__x], this[__y]+another[__y])
>> }
>> }
>
> I like this notation most, because it can be generalised in a
> consistent manner beyond the special case of private names: there is
> no reason that the bit in brackets is just an identifier, we could
> allow arbitrary expressions.
Then the shape of the object is not static. Perhaps this is worth the costs to
implementations and other "analyzers" (static program analysis, human readers).
We should discuss a bit more first, as I just wrote in reply to Allen.
> So the notation would be the proper dual
> to bracket access notation. From a symmetry and expressiveness
> perspective, this is very appealing.
It does help avoid eval abusage, on the upside.
Proceeding bottom-up, with orthogonal gap-filling primitives that compose well,
is our preferred way for Harmony. Private name objects without new syntax,
requiring bracket-indexing, won in part by filling a gap without jumping to
premature syntax with novel binding semantics (see below).
Here, with obj = { [expr]: value } as the way to compute a property name in an
object initialiser (I must not write "object literal" any longer), we are
proceeding up another small and separate hill. But, is this the right design
for object initialisers (which the normative grammar does call
"ObjectLiterals")?
> Notation-wise, I think people would get used to using brackets. I see
> no good reason to introduce yet another projection syntax, like @.
Agreed that unless we use @ well for both property names in initialisers and
private property access, and in particular if we stick with bracketing for
access, then square brackets win for property naming too -- but there's still
the loss-of-static-shape issue.
> Whether additional sugar is worthwhile -- e.g. private declarations --
> remains to be explored. (To be honest, I haven't quite understood yet
> in what sense such sugar would really be more "declarative". Sure, it
> is convenient and perhaps more readable. But being declarative is a
> semantic property, and cannot be achieved by simple syntax tweaks.)
Good point!
The original name declaration via "private x" that Dave championed was
definitely semantic: it created a new static lookup hierarchy, lexical but for
names after . in expressions and before : in property assignments in object
literals. This was, as Allen noted, controversial and enough respected folks on
es-discuss (I recall Andrew Dupont in particular) and in TC39 reacted
negatively that we separated and deferred it. I do not know how to revive it
productively.
/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss