Version block "conditions" with logical operators
Andrew Pennebaker
andrew.pennebaker at gmail.com
Fri Dec 14 00:45:10 UTC 2018
On Wednesday, 11 May 2016 at 17:02:36 UTC, bitwise wrote:
> On Tuesday, 10 May 2016 at 11:12:58 UTC, Tomer Filiba wrote:
>> Hey guys,
>>
>> Looking at our code base (weka), I realized it would be really
>> useful if we had logical operators (negation, conjunction,
>> disjunction) in the version's "condition" clause. Here's what
>> I have in mind:
>>
>> version(!extra_checks) {
>> ...
>> }
>>
>> version(dlang_ver_2069 || dlang_ver_2070) {
>> ...
>> }
>>
>> Today we have lots of ugly code like
>>
>> version(unittest) {} else { ... }
>>
>> and bad-old copy-paste for the logical-or case I mentioned.
>>
>> Is there any reason for that versions can't take compound
>> logical conditions? Alternatively, an isVersion(x) predicate
>> that I could use in a static if could do the trick -- although
>> I think ``version(x || y)`` is more readable than ``static if
>> (isVersion(x) || isVersion(y))``
>>
>> I think it could be a useful feature. Any thoughts?
>>
>> -tomer
>
> Still holding out hope Walter will change his mind here..
>
> His rationale is based on keeping code clean and organized, but
> given that D has no preprocessor macros, it will never look as
> bad as C++ code, or even close.
>
> Compounding versions in C++ accounts for a very small portion
> of the mess. When you have an #if VERS every 5 lines, however,
> you've got a problem...but then, you can do that with D's
> version just the same. The real solution is to properly
> encapsulate system-dependant code so that whatever version
> statement you need, is all in one place. Also when you have to
> hack 10 different macros together to invent a feature your
> language doesn't have, you've got a problem, but this is much
> less of a concern in D than C++.
>
> When even D gurus writing D compilers have to hack solutions
> together with static if to get by, its time to re-evaluate the
> situation.
>
> Bit
Most things aside from straight up
version([!]condition [op condition... [op condition...]) { ... }
[else { ... }]
are going to lead to surprising behavior, bad code, and gnashing
of teeth. We shouldn't have to resort to macros to do this.
More information about the Digitalmars-d
mailing list