version()

Don Clugston dac at nospam.com
Mon Jan 16 05:30:56 PST 2012


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.


More information about the Digitalmars-d mailing list