On Jun 19, 2012, at 10:50 AM, Brendan Eich wrote:

> Another problem with your alternative: either it breaks a refactoring 
> equivalence.
> 
> Let <==> be equivalence for a program fragment, and <!=> be inequivalence. 
> Then we have in JS today extended with do expressions (and gensym via $tmp):
> 
> foo.bar() <==>  do {let $tmp = foo.bar; $tmp.call(foo)}
> 
> Now use ?. used instead of dot. Either the equivalence breaks:
> 
> foo?.bar() <!=>  do {let $tmp = foo?.bar; $tmp.call(foo)}

Why is it important that this equivalence holds for . and ?.  We already have 
other places using references where similar refactoring aren't equivalent:

     typeof foo   <!=> do(let $tmp = foo /*Reference error if foo unresolvable) 
*/; typeof $tmp)

In particular, I'm pretty sure that this refactoring hazard is not going to be 
as significant as the
      foo?.bar()   //oops I'm really think foo?.bar?()
hazard


> 
> Or else your alternative leaks Reference type values into the language, 
> observably, because if
> 
> foo?.bar() <==>  do {let $tmp = foo?.bar; ($tmp == null) ? void 0 : 
> $tmp.call(foo)}
> 
> then
> 
> var fun = foo?.bar;
> fun();
> 
> should not throw if fun is null or undefined, but there's nothing in the 
> fun() expression to signal this to the implementation or readers. This fun 
> would have as its value a new kind of MaybeReference type. We do not want 
> this sub-alternative.

No, of course not.  You can't allow References to leak to the user value level!

Allen

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

Reply via email to