On Aug 4, 2011, at 9:50 PM, Oliver Hunt wrote:

>> The grammar at http://wiki.ecmascript.org/doku.php?id=harmony:classes does 
>> not restrict Statement at all, currently. The 
>> return-the-result-of-an-expression restriction could be done grammatically 
>> but it is easier to do with semantics, prose in this case.
> 
> Indeed, one way to support this would be to have "modes" in the grammar.  If 
> memory serves me correctly ANTLR supports such a concept, although I'm not 
> sure how widely the idea ever spread.  Logically this is syntactic sugar 
> around the large expansion of productions that would typically be necessary.

Parameterized productions are cool, but we have an LR(1) normative grammar and 
the reasons for keeping and validating LR(1) have been covered quite a bit, 
even this year, on es-discuss.

Generally, losing parameterization means duplication (the -NoIn vs. unsuffixed 
productions in ES1-5's grammar), or a semantic restriction (which can be an 
early error, e.g. return outside of a function, break outside of a loop, 
switch, or labeled statement, etc. -- even now we do not overcomplicate the 
grammar to forbid such things from parsing).


> I think part of what's confusing is I am still unclear whether class member 
> functions are expected to apply to arbitrary objects.  My assumption has 
> always been that member functions would throw when applied to an object of 
> the wrong class, and I don't see a good argument for an instance of a class 
> having (essentially) a mutable shape.

Please read the classes proposal. It's "just syntax", this is required for 
Harmony. We are not adding new runtime or (horrors) static semantics by which 
classes would make objects you could not make otherwise.

True, we could freeze -- 'const class' does some freezing and sealing -- but 
not by default. And we could insert |this| class checks in all methods, but 
those too are the exception, not the rule. I'm not sure 'const class' binds 
methods.

If we accept arrow function syntax, then using it in classes to allow 
this-binding is plausible, but this creates a bound method object per method 
per class instance. Heavy tax, akin to closuer pattern. Doing this avoids the 
|this| class check, of course.


> To me when a developer says "class ... {" they are opting out of "an object 
> is a generic map" semantics, and actually want a fixed object shape.

Including the class prototype? I think not.

Anyway, classes that restrict instance and prototype shape, thereby allowing 
private foo to be referenced via 'foo', do not address the other.foo issue. 
Ruby after Smalltalk has *instance-private* instance variables, not 
class-private as we propose. That's why @x works in Ruby and you don't need 
other@x.

We agreed to class-private not instance-private, and that's what the 
harmony:classes proposal aims at (even with the straw and now burned 
private(this)/private(other) syntax). But per last week's meeting, we're going 
to take out private magic syntax from classes and try using private name 
objects: this[foo], other[foo] for private name object denoted foo.

I'm open to @ for private access, personally. (We can also support decorators 
using @ syntax if need be, but that's not currently proposed.) But any such @ 
for private access would also be an infix operator, so you could say other@foo. 
Private name objects used with or without magic syntax for privacy in class 
instance variables are class-private, not instance-private. You could use 
private name objects freshly generated per instance, too, if you wanted to -- 
but we aren't even deferring syntax for that use-case.

/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to