Christoph Pojer wrote:
Tim Yung and I have hacked on a reference implementation for the "Existential Operator" using esprima-fb and jstransform: "a?.b" Example: `a?.b` => `(a == null ? void 0 : a.b)` `a?.b.c` => `(a == null ? void 0 : a.b.c)` This must also make sure that `a` only gets evaluated a single time. Based on previous discussions on es-discuss and TC39, it seems that this was tabled for ES6. I think now is a good time to bring it up for ES7. There is precendence for this feature in other languages - it was recently added to C# and Hack and has always been in CoffeeScript. TypeScript is waiting for TC39: https://github.com/Microsoft/TypeScript/issues/16 In the past, this topic has invited a lot of bikeshedding, but I'd like us to look past this. Several communities within and outside the JS community have identified the need for this operator. My understanding is that a decision needs to be made about whether the operator should short-circuit additional invocations in the call chain if the operand is null (aka. null propagation). For example, if `a` is null, should `a?.b.c`: 1) evaluate to `(void 0).c` and throw a TypeError? 2) short-circuit at `a` and return `void 0`?
I liked the result of using a Null Pattern inside and materializing it outside, which once seemed to be plausible, with that `a?.b.c` would be `void 0` of course. I don't remember on what it all died back then (yes, I have a bias, I wanted a true null pattern, AWB than said it is good inside but not really good as first class person).
It appears that C# chose option #2 whereas Hack and CoffeeScript chose option #1. Our current implementation chose option #1 but we'd be happy to build a reference implementation for option #2. I recall that another issue was that of transitivity. Right now, (a.b).c and a.b.c are equivalent. (a?.b).c and a?.b.c would not be equivalent expressions. I think we need some input from the people on this list about whether this is okay or why we value transitivity for this operator. If we can come to an agreement on the existential operator for member expressions, we would also be setting a precedent for other features of the same family. For example, existential call expressions: `fn?()` which would conditionally invoke `fn`. esprima-fb change: https://github.com/cpojer/esprima/tree/existential-operator jstransform change: https://github.com/yungsters/jstransform/tree/existential-operator Previous discussions on es-discuss: * https://esdiscuss.org/topic/the-existential-operator * https://esdiscuss.org/topic/specifying-the-existential-operator-using-abrupt-completion * https://esdiscuss.org/topic/sept-18-tc39-meeting-notes
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss