On Sunday, 24 June 2018 at 20:03:19 UTC, arturg wrote:
On Sunday, 24 June 2018 at 19:10:36 UTC, Mr.Bingo wrote:
On Sunday, 24 June 2018 at 18:21:09 UTC, rjframe wrote:
On Sun, 24 Jun 2018 14:43:09 +0000, Mr.Bingo wrote:

let is(CTFE == x) mean that x is a compile time constant. CTFE(x) converts a x to this compile time constant. Passing any compile time
constant essentially turns the variable in to a compile time
constant(effectively turns it in to a template with template parameter)


You can use __ctfe:

static if (__ctfe) {
    // compile-time execution
} else {
    // run-time execution
}

This does not work:


import std.stdio;

auto foo(int i)
{
        if (__ctfe)
        {
                return 1;
        } else {
                return 2;
        }
}

void main()
{
        writeln(foo(3));
}


should print 1 but prints 2.

you have to call foo with ctfe
enum n = foo(3);
writeln(n);

This defeats the whole purpose. The whole point is for the compiler to automatically compute foo(3) since it can be computed. Now, with your code, there is no way to simplify code like

foo(3) + foo(8);



auto foo(int i)
{
   if (__ctfe && i == 3)
   {
        return 1;
   } else {
        return 2;
   }
}


Now, this would precompute foo(3), unbeknownst to the caller of foo but then this requires, using your method, to write the code like

enum x = foo(3);
x + foo(8);

We would have to know which values foo would return as compile time values and what not.

foo(x) + foo(y)

could not work simultaneously for both compile time and run time variables.


e.g.,
enum x = 4;
enum y = 4;

foo(x) + foo(y)


would not precompute the values even though x and y are enum's, we have to do


enum x = 4;
enum y = 4;
enum xx = foo(x);
enum yy = foo(y);
xx + yy;


and if we changed x or y to a run time variable we'd then have to rewrite the expressions since your technique will then fail.

int x = 4;
enum y = 4;
enum xx = foo(x); // Invalid
enum yy = foo(y);
xx + yy;


The compiler should be easily able to figure out that foo(3) can be precomputed(ctfe'ed) and do so. It can already do this, as you say, by forcing enum on it. Why can't the compiler figure it out directly?

The problem here, if you didn't understand, is that one can't get foo to be "precomputed" IF it can be done, but IF NOT then it will just get the full computation. Because one does not necessarily know when and where and how foo will be precomputed(or even have completely different behavior for ctfe vs rtfe), one can't use two different methods that have the same syntax.





Reply via email to