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

Reply via email to