Refutable pattern
Brendan Eich
brendan at mozilla.com
Fri Feb 1 12:23:25 PST 2013
Brandon Benvie wrote:
> A postfix '?' would require backtracking when the next '}' is
> found...I think?
First, let me kill the idea of prefix-'?'.
Prefix-'?' in an AssignmentPattern in an AssignmentExpression that is an
ExpressionStatement is ambiguous with the '?' in a
ConditionalExpression, if the programmer mistakenly relies on ASI as if
prefix-'?' were not used. Consider refactoring ES6 code with prefix-'?' from
A = B
{D} = C
L: E
where D is the interior of an object destructuring pattern, to
A = B
?{D} = C
L: E
With postfix-'?' there's no such hazard.
However, naively adding postfix-'?' to the JS grammar does make an
ambiguity, a shift/reduce conflict on '?' -- shift to keep parsing a
ConditionalExpression, or reduce to a '?'-suffixed pattern in a
destructuring assignment.
ES6 draft already splits destructuring binding pattern and assignment
pattern subgrammars (binding vs. assignment, i.e. var/let/const in front
vs. no binding keyword). We could therefore forbid postfix-'?' in
destructuring assignment patterns but not in destructuring binding patterns.
But this is a bit lame, and a refactoring speedbump. I wrote on the
board the following argument for destructuring assignment to be
supported along with binding, which MarkM found persuasive:
function* Fib() {
let [a, b] = [0, 1]; // destructuring binding
while (true) {
yield a;
[a, b] = [b, a + b]; // destructuring assignment
}
}
The two destructurings might want postfix-'?' equally in a different
function with similar structure.
One solution already used in ECMA-262 to regain LR(1) parsing of the
standard grammar is lookahead restriction. Observe that with postfix-'?'
in patterns, the legal lookahead set is {'=', ':' , ',', '}', ']'}. So
we could simply write a lookahead restriction.
We could factor the grammar harder, but this would duplicate most of the
expression grammar, akin to how the -NoIn productions duplicate part of
that sub-grammar. I say let's use a lookahead restriction and get on
with our lives.
Does anyone see a flaw?
/be
>
> On Fri, Feb 1, 2013 at 12:21 PM, Andreas Rossberg <rossberg at google.com
> <mailto:rossberg at google.com>> wrote:
>
> On 1 February 2013 10:56, Axel Rauschmayer <axel at rauschma.de
> <mailto:axel at rauschma.de>> wrote:
> > Beautiful.
> >
> > What do question marks in value (as opposed to key) positions mean?
> > Example: { a: x? }
>
> Not much: a plain identifier 'x' is always matches anyway, i.e. is
> already irrefutable, so wrapping a '?' around it does not have any
> effect (it's like writing "if (true)" or whatever). I removed the
> redundant example.
>
>
> > How does this work grammatically (ternary operator…)?
>
> That still has to be worked out. I'd actually prefer a prefixed ?,
> since it is quite easy to overlook a postfix one trailing a longish
> pattern when reading code. But that may be more difficult to reconcile
> with the existing syntax.
>
> /Andreas
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
> https://mail.mozilla.org/listinfo/es-discuss
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20130201/7e0292b3/attachment.html>
More information about the es-discuss
mailing list