On Monday, 25 April 2016 at 17:52:58 UTC, Andrei Alexandrescu
wrote:
Idea #1: Detect and use CNF, print which clause failed
====
CNF (https://en.wikipedia.org/wiki/Conjunctive_normal_form) is
a formula shape in Boolean logic that groups clauses into a
top-level conjunction.
The compiler could detect and use when CNF is used (as in the
example above), and when printing the error message it only
shows the first failing conjunction, e.g.:
/d935/f781.d(16): Error: template f781.find cannot deduce
function from argument types !()(NotARange, int), candidates
are:
/d935/f781.d(3): f781.find(R, E)(R range, E elem) constraint
failed: isInputRange!NotARange
This is quite a bit better - it turns out many constraints in
Phobos are rather complex, so this would improve many of them.
One other nice thing is no language change is necessary.
Improvement in the generic case is a must. I personally either
comment out the constraint in the lib source (if I can) or
recreate the predicate in a context where I actually can see the
error message. That's tedious and makes me hate template
constraints because for templated libraries the source is there
anyway, I prefer to be given real error (which shows me the exact
issue) rather than a mystery puzzle.
Could your proposal be extended with showing the evaluation for
isInputRange!NotARange to see why it returns false for given
type, i.e. to see that compiler error:
Error: no property 'empty' for type 'NotARange'
So for example the error message could look like:
/d935/f781.d(16): Error: template f781.find cannot deduce
function from argument types !()(NotARange, int), candidates
are:
/d935/f781.d(3): f781.find(R, E)(R range, E elem) constraint
failed: isInputRange!NotARange
constraint stacktrace:
std.range.primitives.isInputRange!NotARange
boolean expression: is(typeof(
(inout int = 0)
{
NotARange r = NotARange.init; // can define a range
object
if (r.empty) {} // can test for empty
r.popFront(); // can invoke popFront()
auto h = r.front; // can get the front of the range
}));
failed with error: no property 'empty' for type 'NotARange'
Btw. I see you've taken a focus on making D more usable. Probably
teaching D to new people gave you some very needed perspective
:P. Big thanks!