<div class="gmail_quote">On 16 January 2012 15:30, Don Clugston <span dir="ltr"><<a href="mailto:dac@nospam.com">dac@nospam.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 16/01/12 01:08, Jonathan M Davis wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
On Monday, January 16, 2012 01:44:56 Manu wrote:<br>
</div><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Surely basic logical expressions within a version seem not only logical,<br>
but also very necessary?<br>
There must be a reason this is impossible, or else I can't believe it's not<br>
already like that...<br>
</blockquote>
<br></div><div class="im">
People have requested it. Walter is against it. I don't remember his exact<br>
arguments, but he believes that it leads to worse code if you allow it.<br>
<br></div><div class="im">
As for<br>
<br>
version(linux || OSX)<br>
<br>
you can use<br>
<br>
version(Posix)<br>
<br>
It'll include FreeBSD as well, but then again, if something is common to both<br>
linux and OSX, then it's almost certainly in FreeBSD as well.<br>
<br></div>
- Jonathan M Davis<br>
</blockquote>
<br>
I think both approaches are wrong. I think the idea approach is to treat versions as booleans, and have a one-definition rule.<br>
<br>
version VersionIdentifier = VersionExpression;<br>
<br>
extern version VersionIdentifier;<br>
// means this version is set from command line, or is a compiler built-in<br>
<br>
VersionExpression:<br>
        VersionExpression && VersionExpression<br>
        VersionExpression || VersionExpression<br>
        !VersionExpression<br>
        ( VersionExpression )<br>
        VersionIdentifier<br>
        true<br>
        false<br>
        <br>
version(A)<br>
{<br>
   version = AorNotB;<br>
}<br>
version(B)<br>
{<br>
}<br>
else {<br>
   version = AorNotB;<br>
}<br>
<br>
becomes:<br>
version AorNotB = A || !B;<br>
<br>
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.<br>
</blockquote></div><br><div>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...</div>
<div>Otherwise I generally agree. Though again, too much water under the bridge to change this decision in the language.</div><div><br></div><div>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.<br>
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.</div>