ch-ch-changes

Christopher Wright dhasenan at gmail.com
Wed Jan 28 16:23:40 PST 2009


Don wrote:
> grauzone wrote:
>> and the code is more obfuscated. If you make an error in your 
>> predicate, random funny things internal to the library implementation 
>> could happen, and the compiler will spurt out indecipherable error 
>> messages for random modules (I guess in this case, std.algorithm or 
>> std.functional).
> 
> Not necessarily. Andrei can just add:
> 
> static if(__traits(compiles, mixin(comp) )) {
>   mixin(comp);
> } else {
>    // static assert is a bit broken,
>    // better to do it this way to provide a backtrace.
>    pragma(msg, "Bad predicate: " ~ comp);
>    deliberate_error_message; // t
> }
> 
> into std.functional. Which will generate a very controlled error message.
> (Doesn't work if the predicate contains mismatched parentheses, but 
> that's fixable).

template MixinThrowHelper(char[] comp)
{
    // if your string mixin requires context, provide it here
    // though this implies code duplication
    mixin (comp);
    enum MixinThrowHelper = true;
}

template Error(char[] msg)
{
    pragma (msg, msg);
    error;
}

static if (__traits (compiles, MixinThrowHelper!(comp)))
{
    mixin (comp);
}
else
{
    Error!("Bad predicate: " ~ comp);
}

> The language changes required to give a perfect solution to this are 
> pretty small (just get static assert() to give the instantiation point 
> of each template which instantiated it, create a version of traits which 
> , given a string, tells you if it would compile if it were mixed in).
> 
> Then we get:
> static assert(__traits(mixincompiles, comp), "Predicate: " ~ comp ~ " 
> does not compile");
> 
> mxin(comp);

That's certainly prettier.



More information about the Digitalmars-d mailing list