On Tuesday, 16 May 2017 at 14:00:51 UTC, Nick Treleaven wrote:
On Tuesday, 16 May 2017 at 11:20:57 UTC, Stanislav Blinov wrote:
On Tuesday, 16 May 2017 at 09:04:32 UTC, Nick Treleaven wrote:
The problem with this approach is all the work required to convert existing code to use this style.
...
That's not a problem. In cases where compiler-provided diagnostic is sufficient, nothing will need to be done.

I don't understand. I thought you were proposing a new language feature (constraint expressions or pragma(overloadError))?

Oh. What I am proposing is add the possibility for the constraints to return a string in addition to the boolean. I am *not* proposing to remove the existing boolean checking. The compiler knows what type the constraint returns. If it's a boolean, nothing is changed. If it's a tuple, it could use the second value as a message (when it needs to output a message, i.e. when all overloads failed). pragma was just presented as an alternative. That's it :) Existing code should not break.

My priority is (1) For the compiler to show which part of a constraint failed. Having inline constraints is lower priority, except:

From a user perspective, I would be interested in what the constraint failure *means*, not which part of it returned false. The constraint is there to prevent me from calling the function with the wrong types of arguments. The author decided which types are wrong. How the author checks for that is their business. Simply telling me I'm wrong does not help me stop being wrong. Showing me the "evidence" (constraint code) does not help me either, because the evidence is arbitrary, and in this case is a process, not statement of fact.

Steven argues that the compiler should be able to show the cause of failure. My counter-argument is that it's not helpful, because an isolated piece of the constraint does not necessarily reflect it's intent. Diagnostic generated from arbitrary code written by the constraint author will be even more confusing than telling nothing at all. Because it is code not written by the user, it may use names not provided by the user, etc. If I wrote a call foo(x), and then compiler tells me:

'property bar.front' is not defined

I'm going to take offense. I didn't pass any 'bar' to that function. Yet it's there because whoever wrote the constraint used a lambda there to test for something. Now I'd have to look at that, figure out what that 'bar' is, etc... Why should I? Why can't the constraint cleanly report what it's "false" result actually means?

Reply via email to