On 16 January 2012 15:30, Don Clugston <[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... Otherwise I generally agree. Though again, too much water under the bridge to change this decision in the language. 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.
