On Thursday, August 9, 2018 7:15:58 AM MDT aliak via Digitalmars-d-learn wrote: > 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.
It's failing, because you got the condition backwards. __ctfe is true during CTFE and false during runtime. Your code has if(__ctfe) writeln("log it"); which means that it will attempt to run writeln at compile time, whereas if you used if(!__ctfe) writeln("log it"); it would skip it at compile time. The problem isn't that writeln is being compiled in. The problem is that it's being encountered when CTFE is running the code. So, a static if is unnecessary. You just need to get the condition right. - Jonathan M Davis