of "Conditional Implementation" vs "Assertive Input Validation"

xenon325 1 at mail.net
Wed Jul 25 04:24:55 PDT 2012


On Wednesday, 25 July 2012 at 07:23:51 UTC, Jacob Carlborg wrote:
> On 2012-07-25 07:30, xenon325 wrote:
>
>>> For this to be useful you really need to create a template 
>>> for every condition
[snip]
>>> With my approach the constraint will have a name which should 
>>> result in a lot better error messages.
>>
>> How is it different from creating a template for every 
>> condition ? ;)
>
> As long as you actually _do_ that, it might not be so much 
> different.

But you would have to create a constraint for every condition as 
well!
And if someone implements Don's idea, error messages would be as 
good.


>> Honestly, I don't quite get what's the difference between 
>> current
>> template constraints and ones you're proposing:
[snip]
>> on the call site it's as convenient and clear as yours.
>> On the definition site, yes, syntax maybe is a tad worse,
>> but it's not *that* bad to require introduction of a new
>> language construct.
>
> Well it depends on that syntax is used. It's clearer if this 
> syntax would be possible:
>
> void foo (InputRange range);

1. How would you signify `foo` is generic ?
    For complier it's probably possible - by type of `InputRange`,
      but that will be one more special case
    What about user ?

2. How would you put 2 constraints on `range` ?

3. Also you forgot to address:

>> template isInputRange(R)
>> {
>>      enum bool isInputRange = is(typeof(
>>      (inout int _dummy=0)
>>      {
>>          R r = void;       /*** how would you express this 
>> b.t.w. ? ***/

    range.d comment on this line is "can define a range object".


> I think it's very little chance of a new language construct 
> being added. It's more like I don't necessarily think the way 
> the template constraints were implemented was the best way.

Sorry, but I still fail to see how you way is (significantly) 
better.


>> Actually the only thing constraint writer needs to know is that
>>     `is(typeof(<code>))`
>> means "compiles". All the rest is perfectly clear.
>
> And why is "(inout int _dummy=0)" there? I would guess that 
> std.algorithm and other parts of Phobos is filled with strange 
> things like this.

Yeah :) My thoughts (have really little D experience):
1. why is it lambda
2. why does it have argument
3. why is arg `inout`
4. why is *dummy* arg initialized

I would think it's some kind of temporary compiler workaround.
But if it's something smart, it could definitely use
better syntax, no objections here (__traits( compiles, ..) ?).


> Then the conclusion would at least be that std.algorithm could 
> use some enhancement how these template constraints are written.

Agree, `(inout int _dummy=0)` is confusing. There well may be 
other (as confusing) examples but probably there are easy ways to 
fix them.
Maybe you should create enhancement request or discuss it with 
community ?


Wait! We were talking about how to make compiler error messages 
better.




More information about the Digitalmars-d mailing list