On Jul 18, 2011, at 1:37 PM, Brendan Eich wrote:

> On Jul 18, 2011, at 12:16 PM, Allen Wirfs-Brock wrote:
> 
>> On Jul 18, 2011, at 11:32 AM, Brendan Eich wrote:
>> 
>>> Hawt.
>>> 
>>> A bit rough in that LHS <& RHS mutates LHS, whereas LHS <| RHS is pure and 
>>> produces a new object (which could be optimized to mutate RHS, note well!). 
>>> Both <| and <& are operators, to support chaining. Would it be better for 
>>> <& to be pure as <| is, and make an assignment operator form, LHS <&= RHS, 
>>> that expands to LHS = LHS <& RHS?
>> 
>> One way to think about <& is as a more declarative and more concise 
>> alternative to Object.defineProperties. I think there are plenty of use 
>> causes for the mutating extends.  For example, adding properties to the 
>> prototype object of a function.  Another issue is that the object you need 
>> to extend may already have been captured somewhere.  For example, a 
>> super.constructor call might have registered the object in a WeakMap and if 
>> <& created a new instance you would loose the identify relationship.
> 
> Sure, I'm not saying word one against the mutating form -- just noting the 
> symmetry break w.r.t. <| and suggesting a fix that builds on the assignment 
> operator.

You're right it can be viewed that way.  Even though I know that = or += and 
friends are just operators I think I tend to think of them more like a 
statement form.  Also all the other assignment operators are operations upon 
values and they modify a variable rather than mutate an object.  I see where 
you're coming from on this but personally that lack of symmetry with the other 
assignment operators feels more disconcerting then the lack of symmetry with <|.


> 
> 
>> In practice, I think most of the more declarative uses such as adding own 
>> properties can be implemented (and perhaps even specified) such that no 
>> extra objects need to be created.
> 
> Agreed.
> 
> 
>> One thing that I think is still open is whether the RHS needs to be an 
>> ObjectLiteral or whether any object producing expression should be allowed.  
>> All the use cases  I have explored use an ObjectLiteral but I don't see any 
>> hazard (like would be the case if <| mutated the LHS [[Prototype]]) with 
>> allowing a non-literal value of the RHS.
> 
> Probably right; another symmetry break.

Yes, if the symmetry argument would be my primary reason for restricting the 
RHS.  But then <& could be use for things like:

Object.prototype.extend = function (obj) {this <& obj};


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

Reply via email to