On Tuesday, 31 March 2015 at 06:20:22 UTC, Andrei Alexandrescu wrote:
On 3/30/15 8:49 PM, deadalnix wrote:
On Tuesday, 31 March 2015 at 01:01:24 UTC, Andrei Alexandrescu wrote:
On 3/30/15 5:49 PM, deadalnix wrote:
Why are you doing the replacement top/down rather than bottom up ?

What would be the alternative? -- Andrei

Doing the replacement bottom up :

a = a++;

a += { auto olda = a; a = a + 1; return olda; }();

a = cast(typeof(a)) (a + { auto olda = a; a = a + 1; return olda; }());

You need another lowering here because you evaluate a twice. Consider:

import std.stdio;
int a;
ref int fun() { writeln("meh"); return a; }
void main() {
  fun() = i++;
}


Yeah, I had an int in mind. Make it

{
    aPtr = &a;
*aPtr = cast(typeof(a)) (*aPtr + { auto olda = *aPtr; *aPtr = a + 1; return olda; }());
    return *aPtr;
}()

Other code transformation do not require a function call to take place,
so why would this require one (which force eager evaluation of
parameters) ?

Everything needs to be evaluated (and only once).

That is also inconsistent with LTR evaluation.

I don't see how.


a appear on the left of a++. a should be evaluated before a++. You propose that it isn't.

On the other hand, that
would make behavior consistent with what opOpAssign would give, so why not.

Whatever makes all sleep at night. Could you please submit a PR for the spec with the lowerings discussed?



Reply via email to