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.