Is it possible to make a module constructor run at compile-time? If so, how?
Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
June 19, 2022 Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
June 19, 2022 Re: Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ruby The Roobster | 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. |
June 19, 2022 Re: Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Backus | 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.
|
June 19, 2022 Re: Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ruby The Roobster | 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 = ...;
}
|
June 19, 2022 Re: Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Backus | 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.
|
June 19, 2022 Re: Conpile-Time module constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ruby The Roobster | 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).
|
Copyright © 1999-2021 by the D Language Foundation