Improving version(...)
Nick Sabalausky
a at a.a
Tue Oct 19 17:42:19 PDT 2010
"Jesse Phillips" <jessekphillips+D at gmail.com> wrote in message
news:i9l935$5ul$1 at digitalmars.com...
> bearophile Wrote:
>
>> If built-in versions are inside some kind of enum or namespace, the
>> compiler can tell apart the built-in ones from all the other ones, so if
>> you write:
>> version(std.D_Inline_Asm_X86_65)
>> The compiler will complain that doesn't exists among the standard ones.
>>
>> If you want to use your own ones you just don't use the "std." prefix:
>> version(myFoo)
>>
>> Bye,
>> bearophile
>
> Note that the latest highlighting file for Vim will highlight the known
> built-in version Identifiers.
>
> I don't have much of a suggestion for solving the real issue, but maybe
> the compiler could return a list of versions used? Though that brings to
> question what happens to versions used in side versions.
Clearly, the current version system is a suboptimal design. Unfortunately,
given the specific nature of it, it doesn't appear to be possible work
around this particular issue. And I don't think it's possible to sidestep it
with a library-based alternative either, due to D's apperent inability to
have deterministic cross-module global mutable state at compile time (see
the thread "[challenge] Limitation in D's metaprogramming").
So I think aside from a pre-processor, the only real way to solve this issue
is to redesign the version system to not work on a basis of "defined/not
defined". I would certainly be in favor of that, but I suspect it would
probably mean a D3 (or at least a D2.5 - "@version" anyone?).
Although, here's another idea that might at least help (athough not nearly
as cleanly as a redesigned version system):
There could be a "__traits(allVersionIdents)" that returns an array of all
identifiers that are actually used anywhere in the program, *even* ones that
turn out to be undefined. Or maybe a __traits that returns *just* the
version identifiers that are used but undefined. This list is logically (if
not physically) built up *before* any "version{}", "debug{}", or "static if"
conditionals are actually evaluated (but after any string mixins, so that
might be tricky, if even possible). Then, you can validate that list against
all of the identifiers that you expect to possibly be used. There would also
be a "__traits(builtinVersionIdents)" to aid with this.
More information about the Digitalmars-d
mailing list