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.

Reply via email to