Exponentiation operator precedence
Jason Orendorff
jason.orendorff at gmail.com
Tue Aug 25 02:04:05 UTC 2015
On Mon, Aug 24, 2015 at 8:10 PM, Waldemar Horwat <waldemar at google.com> wrote:
> That has different right and left precedence and is probably the closest to
> the mathematical intent.
Not to quibble, but I do want to understand:
UnaryExpression : PostfixExpression ** UnaryExpression
AdditiveExpression : AdditiveExpression + MultiplicativeExpression
We don't say binary `+` has different left and right precedence,
right? What's different with `**`, apart from being right-associative?
> However, it does carry other surprises. What does
> each of the following do?
Interesting:
++x ** y; // early error: invalid operand for ++
(because it's parsed as `++(x ** y)`)
x++ ** y; // parses as expected: (x++) ** y
x ** ++y; // parses as expected: x ** (++y)
x ** y++; // parses as expected: x ** (y++)
I'm OK with this. It should be rarer in practice than `-x**2`, and at
least the language won't silently assign a surprising meaning to user
code.
It could be made to parse as `(++x) ** y` by changing prefix ++ and --
to be higher precedence than the other prefix operators. I don't think
this would break any existing programs, because combinations like
`++typeof 3` are already early errors. PHP apparently does something
like this:
$ php -r '$x = 3; print(++$x**2 . "\n"); print($x . "\n");'
16
4
D doesn't. Python and Haskell don't have ++/--.
-j
More information about the es-discuss
mailing list