version()

Don nospam at nospam.com
Mon Jan 16 13:37:56 PST 2012


On 16.01.2012 15:27, Manu wrote:
> On 16 January 2012 15:30, Don Clugston <dac at nospam.com
> <mailto:dac at nospam.com>> 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.



More information about the Digitalmars-d mailing list