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 <rossb...@google.com
<mailto:rossb...@google.com>> wrote:
On 1 February 2013 10:56, Axel Rauschmayer <a...@rauschma.de
<mailto:a...@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@mozilla.org <mailto:es-discuss@mozilla.org>
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss