How do you put log calls in constructors when they may be created in a static context?

aliak something at something.com
Thu Aug 9 13:15:58 UTC 2018


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.



More information about the Digitalmars-d-learn mailing list