On Aug 9, 2012, at 1:49 PM, Brendan Eich wrote:

> Allen Wirfs-Brock wrote:
>> targetObj.prop = value         //assign a value to a single property
>> targetObj .= sourceObj        //assign values from sourceObj properties to 
>> corresponding targetObj properties
>> targetObj := sourceObj        //define properties on targetObj that clone 
>> properties of sourceObj
>> 
>> If we only defined := now, we could still define .= in the future.  If we 
>> define .= now to mean "define property" we don't have a good future 
>> alternative for  "assign multiple property values"
> 
> But .= does not connote "assign" rather than "define". You make the case that 
> := suggests "define" by reference to the : separating property name from 
> value in object literals, and that's helpful. There's no dot analog for 
> colon, however.
> 
> Indeed if sourceObj is an object literal, we'd have, e.g.,
> 
> targetObj .= {prop1: val1, prop2: val2}
> 
> and at least as many colons as dots.

Well, strictly speaking the object literal that is the RHS of the above example 
is defining properties on a new object and those the properties of that object 
are then assigned to corresponding properties of the LHS object.

Regardless, the associations between the symbols and the semantics don't have 
to be perfect they just have to be close enough to have some mnemonic value. 

> 
> The more I think about this, the more I doubt we can help people decide 
> between assignment and definition just by giving both short syntax. The 
> requirement to define rather than assign is independent of syntax at the 
> redefinition point, inherent in the object model being used.
> 
> Further, assignment via = will remain the most common case, and the source of 
> bugs to reduce by documentation and education, no matter the syntax of the 
> fix. In teaching people how to make the fix or avoid the bug, you're right 
> that short syntax can help, but it's not clear how much. As Dave points out, 
> that depends on how often the need for define-not-assign arises.
> 

I don't think the new syntax would directly help them understand their 
intention.  That is something they need to understand, independent of syntax.  
But the existence of both = and :=   may encourage developing this level of 
understanding; simply by making the choice available.

The primarly purpose of new syntax shouldn't be pedagogical.  Rather it should 
help and encourage good programmers to write good code. I want programmer who 
know they are defining a property to be able to easily express that intent 
rather than lazily using = even though they know  better.  I'm pretty sure I 
would always use :={...} over = in those situations.  I not so sure that I 
would be disciplined enough to always use Object.update(...) rather than  = in 
such situations.

> I fear we're missing the opportunity to get into Object.update by getting 
> stuck on syntax. The ES5 APIs are too verbose but that doesn't mean something 
> like Object.extend should be left to libraries and not built in, as JSON and 
> Function.prototype.bind were in ES5.

I certainly don't have any objection to have the procedural forms.  Personally, 
I think Object.define and Object.assign would be a good names for the two 
concepts we have been talking about.  Having such functions would actually make 
it easier to explain corresponding syntactic forms.
Object.define(Point, {
   fromPolar(rho,theta) {
      return new this(rho*Math.cos(theta), rho*Math.sin(theta))
   }
});
is not as readable or writable as:
Point := {
   fromPolar(rho,theta) {
      return new this(rho*Math.cos(theta), rho*Math.sin(theta))
   }
};
(note how "Point" gets visually lost in the procedural form. The eye focuses on 
"Object.define" rather than the more important "Point")

If := wasn't available I'd certainly want to have the procedural form 
available.  All names are bikeshedable...

Allen







> 
> /be
> 

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

Reply via email to