On 16.01.2012 15:27, Manu wrote:
On 16 January 2012 15:30, Don Clugston <[email protected]
<mailto:[email protected]>> wrote:

    On 16/01/12 01:08, Jonathan M Davis wrote:

        On Monday, January 16, 2012 01:44:56 Manu wrote:

            Surely basic logical expressions within a version seem not
            only logical,
            but also very necessary?
            There must be a reason this is impossible, or else I can't
            believe it's not
            already like that...


        People have requested it. Walter is against it. I don't remember
        his exact
        arguments, but he believes that it leads to worse code if you
        allow it.

        As for

        version(linux || OSX)

        you can use

        version(Posix)

        It'll include FreeBSD as well, but then again, if something is
        common to both
        linux and OSX, then it's almost certainly in FreeBSD as well.

        - Jonathan M Davis


    I think both approaches are wrong. I think the idea approach is to
    treat versions as booleans, and have a one-definition rule.

    version VersionIdentifier = VersionExpression;

    extern version VersionIdentifier;
    // means this version is set from command line, or is a compiler
    built-in

    VersionExpression:
            VersionExpression && VersionExpression
            VersionExpression || VersionExpression
            !VersionExpression
            ( VersionExpression )
            VersionIdentifier
            true
            false

    version(A)
    {
       version = AorNotB;
    }
    version(B)
    {
    }
    else {
       version = AorNotB;
    }

    becomes:
    version AorNotB = A || !B;

    Make it illegal to reference a version identifier which hasn't been
    declared. Disallow version declarations inside version blocks, and
    all the spaghetti is gone.


Will that work? I don't think it's reasonable to expect all versions to
be declared in all cases/platforms. There are SSE version identifiers
for instance, why would they be defined on a PPC platform? Likewise any
platform specific features...

If they're used in a version statement, they would be declared as extern version. Which just means, they're not defined anywhere in the code.


Otherwise I generally agree. Though again, too much water under the
bridge to change this decision in the language.

This could be done without breaking existing code - the syntax is different.
You don't get the full benefit of disallowing undefined identifiers in version statements, but you'd still have that benefit in version expressions. In practice, it would be so much nicer to do complicated version expressions this way, that the existing syntax would fall out of use except in the simple cases.



The only realistic thing I can see that could be done without breaking
anything is to allow basic logical expressions of version keys which
would otherwise still follow the existing idiom.
Alternatively, allow static-if to access the version list/map. If the
version list was known to static-if, it could take care of the same job,
though it would probably be considerably more ugly.

Reply via email to