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.