On the subject of error messages
Nick Treleaven via Digitalmars-d
digitalmars-d at puremagic.com
Tue May 16 02:04:32 PDT 2017
On Saturday, 13 May 2017 at 14:41:50 UTC, Stanislav Blinov wrote:
>>template types(args...) {
>> static if (args.length)
>> alias types = AliasSeq!(typeof(args[0]),
>> types!(args[1..$]));
>> else
>> alias types = AliasSeq!();
>>}
...
>> foreach(i, T; types!args) {
typeof(args) ;-)
>> static if (is(T == string)) {
>> pragma(msg, format!"Argument %d is a string, which
>> is not supported"
>> (i+1));
The problem with this approach is all the work required to
convert existing code to use this style. Breaking the binary ops
of the constraint into parts and reporting which failed (as the
other replies mention) already would work with existing code,
even if your approach can allow better messages. The binary ops
part would immediately bring a huge improvement, despite any
deficiencies.
> There are other alternatives, e.g. there's a DIP by Kenji Hara:
>
> https://wiki.dlang.org/User:9rnsr/DIP:_Template_Parameter_Constraint
>
> The approach I'm proposing is more flexible though, as it would
> allow to
> evaluate all arguments as a unit and infer more information
> (e.g. __traits(isRef, args[i]).
> Constraint on every argument won't allow the latter, and would
> potentially require writing more explicit overloads.
I think we should allow inline constraints*, non-inline
constraints can still be used/combined. Inline constraints are
easier to read and relate to what they affect, allowing any
non-inline constraint to be considered as something with a wider
scope (i.e., multiple arguments).
* template foo(R if isInputRange)
A side benefit is enum/alias/variable templates, they don't
currently allow constraints in the grammar - they could have
inline constraints without harming readability (presumably why
constraints aren't supported).
More information about the Digitalmars-d
mailing list