www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Conpile-Time module constructor

reply Ruby The Roobster <rubytheroobster yandex.com> writes:
Is it possible to make a module constructor run at compile-time?  
If so, how?
Jun 19 2022
parent reply Paul Backus <snarwin gmail.com> writes:
On Sunday, 19 June 2022 at 14:51:26 UTC, Ruby The Roobster wrote:
 Is it possible to make a module constructor run at 
 compile-time?  If so, how?
No, it's not. What are you trying to accomplish that lead you to ask this question? There is probably a different way to do it without involving module constructors.
Jun 19 2022
parent reply Ruby The Roobster <rubytheroobster yandex.com> writes:
On 6/19/2022 11:19 AM, Paul Backus wrote:
 On Sunday, 19 June 2022 at 14:51:26 UTC, Ruby The Roobster wrote:
 Is it possible to make a module constructor run at compile-time?  If 
 so, how?
No, it's not. What are you trying to accomplish that lead you to ask this question? There is probably a different way to do it without involving module constructors.
What I was trying to accomplish was to change a compile time array whenever a certain module was included. The value of the array needs to be known at compile time.
Jun 19 2022
parent reply Paul Backus <snarwin gmail.com> writes:
On Sunday, 19 June 2022 at 15:34:48 UTC, Ruby The Roobster wrote:
 On 6/19/2022 11:19 AM, Paul Backus wrote:
 On Sunday, 19 June 2022 at 14:51:26 UTC, Ruby The Roobster 
 wrote:
 Is it possible to make a module constructor run at 
 compile-time?  If so, how?
No, it's not. What are you trying to accomplish that lead you to ask this question? There is probably a different way to do it without involving module constructors.
What I was trying to accomplish was to change a compile time array whenever a certain module was included. The value of the array needs to be known at compile time.
You can do this with a `static if` check: static if (__traits(compiles, { import mymodule; })) { // mymodule is included enum compileTimeArray = ...; } else { // mymodule is not included enum compileTimeArray = ...; }
Jun 19 2022
parent reply Ruby The Roobster <rubytheroobster yandex.com> writes:
On 6/19/2022 11:55 AM, Paul Backus wrote:
 On Sunday, 19 June 2022 at 15:34:48 UTC, Ruby The Roobster wrote:
 On 6/19/2022 11:19 AM, Paul Backus wrote:
 On Sunday, 19 June 2022 at 14:51:26 UTC, Ruby The Roobster wrote:
 Is it possible to make a module constructor run at compile-time?  If 
 so, how?
No, it's not. What are you trying to accomplish that lead you to ask this question? There is probably a different way to do it without involving module constructors.
What I was trying to accomplish was to change a compile time array whenever a certain module was included.  The value of the array needs to be known at compile time.
You can do this with a `static if` check:     static if (__traits(compiles, { import mymodule; }))     {         // mymodule is included         enum compileTimeArray = ...;     }
Curious - how exactly does this determine if the module is included? I thought __traits(compiles, ...) only checks if an expression is SEMANTICALLY correct.
Jun 19 2022
parent Paul Backus <snarwin gmail.com> writes:
On Sunday, 19 June 2022 at 15:57:41 UTC, Ruby The Roobster wrote:
 On 6/19/2022 11:55 AM, Paul Backus wrote:
 
 You can do this with a `static if` check:
 
      static if (__traits(compiles, { import mymodule; }))
      {
          // mymodule is included
          enum compileTimeArray = ...;
      }
Curious - how exactly does this determine if the module is included? I thought __traits(compiles, ...) only checks if an expression is SEMANTICALLY correct.
You're right--technically, it doesn't check whether the module is *included* in the final build, only whether the module is *available* for inclusion at compile time. Because D supports separate compilation of modules, there is no way to check at compile time what modules will be included in the final build. If that's what you want to test for, you will have to move the check out of the code itself and into your build system (for example, by passing a `-version=HasMyModule` flag for builds that include the module in question).
Jun 19 2022