On Saturday, 2 December 2023 at 13:16:26 UTC, Johannes Miesenhardt wrote:
Hello,
I am trying to learn D and I have stumbled upon an issue
Consider this code:
```d
import std.stdio;

//version = Test;

int main() {
        version (Test) {
                writeln("Hello, world!");
        }
        return 0;
}
```

This compiles, however what if we want to turn the version statement around? I first expected `version (!Test)` to work, but it doesn't since the grammar says:
```
VersionCondition:
    version ( Identifier )
    version ( unittest )
    version ( assert )
```

We are using the first way, the one with the Identifier.
The reason inverting works with if-statements is because they take an "Expression".

I see the way why it doesn't work, but I think it should. Considering that
`version (Test) {} else {`
works without any issue but looks very ugly.

Can somebody explain if this is an intended decision or what I should do instead of using my ugly replacement?

It depends what do you want to achieve, if you just want a bool at the top of your module to toggle features, then you can do this:

```D
import std.stdio;

enum Test = true;

int main() {
    static if (Test == false) {
writeln("this will never be called, it won't be compiled");
    } else {
        writeln("hello!");
    }
    return 0;
}
```

``static if`` is evaluated at compile time, you can mix it with ``version`` if you need to provide the flag during compilation

```D
import std.stdio;

version (Test)
    enum HasTest = true;
else
    enum HasTest = false;

int main() {
    static if (HasTest == false) {
writeln("this will never be called, it won't be compiled");
    } else {
        writeln("hello!");
    }
    return 0;
}
```


I wish we could use ``version`` as expression, to void the repetition:

```D
import std.stdio;

enum HasTest = version (Test) ? true : false;

int main() {
    static if (HasTest == false) {
writeln("this will never be called, it won't be compiled");
    } else {
        writeln("hello!");
    }
    return 0;
}
```

If someone able to do it, would be cool to see a PR

Reply via email to