digitalmars.D.learn - Inversion of conditional compilation statements
- Johannes Miesenhardt (32/32) Dec 02 2023 Hello,
- user1234 (6/14) Dec 02 2023 It's an intended decision that's often debated, a.k.a "version
- ryuukk_ (52/84) Dec 02 2023 It depends what do you want to achieve, if you just want a bool
- Nick Treleaven (9/14) Dec 02 2023 Tomek Sowiński wrote this template:
- ryuukk_ (21/37) Dec 02 2023 I have something similar that i found somewhere here
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?
Dec 02 2023
On Saturday, 2 December 2023 at 13:16:26 UTC, Johannes Miesenhardt wrote:Hello, [...] 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's an intended decision that's often debated, a.k.a "version algebra". The official position on version algebra is that complex conditions (think `&&` and `||`) would be a source of bugs.
Dec 02 2023
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
Dec 02 2023
On Saturday, 2 December 2023 at 15:03:25 UTC, ryuukk_ wrote:I wish we could use ``version`` as expression, to void the repetition: ```D import std.stdio; enum HasTest = version (Test) ? true : false;Tomek Sowiński wrote this template: ```d enum bool isVersion(string ver) = !is(typeof({ mixin("version(" ~ ver ~ ") static assert(0);"); })); static assert(isVersion!"assert"); static assert(!isVersion!"Broken"); ```
Dec 02 2023
On Saturday, 2 December 2023 at 15:48:02 UTC, Nick Treleaven wrote:On Saturday, 2 December 2023 at 15:03:25 UTC, ryuukk_ wrote:I have something similar that i found somewhere here ```D struct Version { static bool opDispatch(string identifier)() { mixin(" version(", identifier, ") return true; else return false; "); } } static if (Version.something == false) {} ``` But i don't even use it since it requires me to import a module, it not worth it, i'd rather have version as expressionI wish we could use ``version`` as expression, to void the repetition: ```D import std.stdio; enum HasTest = version (Test) ? true : false;Tomek Sowiński wrote this template: ```d enum bool isVersion(string ver) = !is(typeof({ mixin("version(" ~ ver ~ ") static assert(0);"); })); static assert(isVersion!"assert"); static assert(!isVersion!"Broken"); ```
Dec 02 2023