@ctfeonly
Mike Franklin
slavo5150 at yahoo.com
Fri Dec 8 06:16:43 UTC 2017
On Friday, 8 December 2017 at 01:30:13 UTC, Manu wrote:
> I tried this, and was surprised it didn't work:
>
> int ctfeOnly(int x)
> {
> static assert(__ctfe);
> return x + 1;
> }
>
> This would probably solve the problem in a satisfying way
> without an attribute?
Interestingly, if you put `__ctfe` in a function it does seem to
work (unless I'm missing something). Check this out.
import std.stdio;
bool isRunTime()
{
return !__ctfe;
}
bool isCompileTime()
{
static if (!isRunTime())
return __ctfe;
else
return false;
}
string onlyCompileTime()
{
static assert(isCompileTime(),
"This function can only be executed at compile time");
assert(isCompileTime(),
"This function can only be execute at compile time");
return "onlyCompileTime";
}
string onlyRunTime()
{
// This assert will actually throw an error at compile-time,
// if an attempt is made to execute it at compile time.
assert(isRunTime(), "This function can only be executed at
run time");
return "onlyRunTime";
}
void main(string[] args)
{
static assert(isCompileTime());
static assert (!isRunTime());
assert(!isCompileTime());
assert(isRunTime());
static assert(onlyCompileTime() == "onlyCompileTime");
// Compile-time Error: Good!
//static assert(onlyRunTime() == "onlyRunTime");
assert(onlyRunTime() == "onlyRunTime");
// Compile-time Error: Good!
// pragma(msg, onlyRunTime());
// I couldn't figure out how to force `onlyCompileTime` to
// execute at runtime. That's probably a good thing.
}
https://run.dlang.io/is/64fRRX
I guess this is due to the fact that wrapping `__ctfe` in a
function causes it to run at compile-time instead of
at...well...compile-time (i.e.
https://wiki.dlang.org/User:Quickfur/Compile-time_vs._compile-time)
Mike
More information about the Digitalmars-d
mailing list