On Dec 21, 2010, at 4:25 PM, Brendan Eich wrote:

> On Dec 21, 2010, at 4:01 PM, Oliver Hunt wrote:
> 
>> Just giving my feedback to this (so it's recorded somewhere other than my 
>> head).
>> 
>> I find the apparent necessity of conflating syntax and semantics irksome, 
>> i'd much rather that there be two distinct discussions one of syntax and the 
>> other for semantics of soft-fields, private names, gremlins, etc (or 
>> whatever this general concept ends up being called)
>> 
>> That said I don't really like the private names syntax, mostly for reasons 
>> others have bought up already, but one case I don't recall seeing is 
>> something that I think will lead to surprise on the part of developers.  Say 
>> i have a piece of code:
>> 
>> function MyAwesomeThing() {
>>    ....
>> }
>> 
>> MyAwesomeThing.prototype.myCoolFunction = function() {
>>    if (!this._myCachedHotness)
>>        this._myCachedHotness = doExpensiveThing(this)
>>    return this._myCachedHotness;
>> }
>> 
>> I see this nifty private names feature, and say "cool! now i can make my 
>> cache super secret!" and do:
>> 
>> MyAwesomeThing.prototype.myCoolFunction = function() {
>>    private cachedHotness;
>>    if (!this.cachedHotness)
>>        this.cachedHotness = doExpensiveThing(this)
>>    return this.cachedHotness;
>> }
>> 
>> I would _expect_ this to work.  That's what the syntax makes me think.  But 
>> it won't work because 'cachedHotness' is going to be different on every call 
>> (at least to my reading).
> 
> Why does your expectation differ here compared to the following:
> 
> MyAwesomeThing.prototype.myCoolFunction = function() {
>    var cachedHotness = gensym();
>    if (!this[cachedHotness])
>        this[cachedHotness] = doExpensiveThing(this)
>    return this[cachedHotness];
> }
> 
> Is it because |private cachedHotness;| does not "look generative"?

Yes.  The fact that we know how they are implemented behind the scenes may make 
the non-obvious appear obvious.

> 
> 
>> I am not trying to argue that making the above work is impossible -- you 
>> just need to use a few closures to get everything into the right place.  But 
>> it is contrary to what I might expect or want.
>> 
>> wrt. proxies, I still think that we should just allow all non-objects 
>> property names to transfer through uncoerced.  It would solve the problem of 
>> communicating private names to a proxy and allow efficient array-like 
>> implementations.
> 
> You mean non-string property names, right?

Yes

> 
> But what is an array index, then? uint32 is not a type in the language. Would 
> proxy[3.14] really pass a double through?
Yes, I would expect no coercion of any non-object.  The reason for disallowing 
objects is safety afaik, those arguments don't apply to non-objects.

> 
> Array elements are named by a weird uint32 index name, with consequences on 
> 'length' (but only up to 2^32 - 1 for length). I don't think passing the 
> property name through uncoerced helps, unless you assume a normalizing layer 
> above all name-based operations that specializes to index-names per Array's 
> uint32 magic weirdness.

And people are welcome to implement those semantics if they so desire.  I just 
see no reason to artificially limit behaviour.  Especially when the alternative 
is to say that the argument to the trap "will be a string, except in this case 
that you don't expect".  I think it's better to be consistent and simply allow 
all non-objects through.  This allows better perf for some use cases, and to my 
mind simpler semantics in the face of things like private names.

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

Reply via email to