On Thursday, 9 August 2018 at 12:01:42 UTC, Jonathan M Davis
wrote:
On Thursday, August 9, 2018 2:37:49 AM MDT aliak via
Digitalmars-d-learn wrote:
On Wednesday, 8 August 2018 at 23:47:22 UTC, Jonathan M Davis
wrote:
> On Wednesday, August 8, 2018 3:54:34 PM MDT aliak via
>
> Digitalmars-d-learn wrote:
>> I'm trying to debug stuff, so I want to add verbose logging
>>
>> struct S(T) {
>>
>> this() {
>>
>> writeln("created S(T) with properties and ID");
>>
>> }
>>
>> }
>>
>> static a = S!int(); // bah
>>
>> I guess users can call this code from any context, but when
>> i'd also like to see the log output for debugging purposes.
>> Is there a way around this?
>>
>> Can I maybe only do a writeln in a non compile-time context?
>
> if(__ctfe)
> {
>
> // code here will execute if this is encountered during
> CTFE
>
> }
> else
> {
>
> // code here will execute if this is encountered outside
> of
>
> CTFE
> }
>
> - Jonathan M Davis
That won't work because __ctfe is not readable at compile
time. And I don't want that writeln there when there's compile
time evaluation because errors.
Huh? __ctfe's entire purpose is so that you can differentiate
between code that's run at compile-time and code that's run at
runtime. If a piece of code is executed at compile-time, __ctfe
is true, whereas if it's executed at runtime, __ctfe is false.
So, if you have
this(T i)
{
if(!__ctfe)
writeln("log it");
}
then the code will print "log it" if the object is constructed
at runtime, whereas it won't print anything if it's run at
compile time, and there won't be any errors for trying to call
writeln at compile time, because it will have been skipped.
- Jonathan M Davis
Maybe I'm just explaining what I'm trying to do wrong, but that
code doesn't compile when "this" is called in a valid compile
time evaluation context, you'll get errors:
https://run.dlang.io/is/KiJrR1
That link contains the gist of what I want to do. If you could
static if (__ctfe) ... then that'd work but I don't know if
there's something like that. Alternatively, if I can get a non
compile time evaluated static then that also will do the trick.