On Sunday, 11 June 2017 at 15:25:11 UTC, Andrei Alexandrescu
wrote:
On 6/11/17 11:11 AM, Nick Treleaven wrote:
On Sunday, 11 June 2017 at 00:28:58 UTC, Andrei Alexandrescu
wrote:
https://github.com/dlang/phobos/pull/5461
There's many good advantages to this. The immediate one is
the constraint is better structured and easier to understand.
Then, the compiler can print the exact clause that failed,
which improves the precision and quality of the error message.
Great!
Thanks.
// Also possible (no change to the language)
enum bool isInputRange(R) =
is(typeof((ref R r) => r)) && msg("must be copyable")
&& is(ReturnType!((R r) => r.empty) == bool) && msg("must
support bool empty")
&& is(typeof(lvalueOf!R.front)) && msg("must support
front")
&& is(typeof(lvalueOf!R.popFront)) && msg("must support
back");
I'm not getting how this works.
Ostensibly the function is trivial:
bool msg(string) { return true; }
It doesn't change the semantics. The compiler would recognize
it as an intrinsic and would print the message if the clause to
its left has failed.
Andrei
Exposing magic functions which are recognized by name strikes me
as being worse then proper compiler intrinsics.