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
[email protected]
https://mail.mozilla.org/listinfo/es-discuss