On Friday, 14 June 2013 at 00:13:37 UTC, Jonathan M Davis wrote:
On Friday, June 14, 2013 02:02:23 David Nadlinger wrote:
On Thursday, 13 June 2013 at 23:25:42 UTC, Jonathan M Davis
wrote:
> Walter has expressed a desire in the past to make it so that
> D
> requires that
> the evaluation order of arguments be left-to-right in order
> to
> avoid bugs, and
> while these aren't exactly function arguments, …
Actually, behind the scenes all three are arguments to *one*
function call: the druntime array op implementation.
Anyway, my question was mainly about the assignment operator,
which is obviously not expected to behave lexically
left-to-right
by that test case.
I don't see how the assignment operator could possibly work
left-to-right
What do you mean? assignment requires two arguments: the
*reference* of lhs, and value/reference or rhs. Regardless of if
lhs is a value or expression, the compiler still needs to know
*where* to assign to.
I don't see any reasons why the compiler couldn't choose lhs
first instead.
*as* a matter of fact, that's how gcc does it for C++:
//----
int main()
{
int i = 0;
++i = ++i;
assert(i == 2); //passes
}
//----
Left to right
First, evaluate lhs: i has the value 1.
then evaluate rhs, which will now have the value 2.
assign 2 to i.
* i == 2 *
right to left:
First, evalutate rhs: i has the value 1, an rhs 1.
Evaluate lhs: i is now 2.
But then assign rhs (1) to lhs.
* i == 1 *
So yeah, left to right evaluation is completely coherent, and a
valid scheme.
Heck, you'll notice this *also* passes with DMD, so dmd *also*
evaluates opEqual left to right.
So I guess this "surprising behavior" is the evaluation order we
want to enforce?
---------
I remember the discussion:
http://forum.dlang.org/thread/bniaxycuguviwfdto...@forum.dlang.org
For the record, I don't remember there being a consensus... at
all...
There were 3.5 positions:
1) left to right evaluation
2) right to left evaluation
3) specifically unspecified
3.5) error when compiler sees ambiguity
I'm personally in favor of 3, with some 3.5 as a warning.
Evaluation order, even when defined, remains obscure once
associative operations come into play, and still bite you in the
ass anyways, so I don't see anything good out of forcing it one
way or the other anyways.