On Friday, 24 July 2015 at 04:42:59 UTC, Walter Bright wrote:
On 7/23/2015 3:12 PM, Dicebot wrote:
On Thursday, 23 July 2015 at 22:10:11 UTC, H. S. Teoh wrote:
OK, I jumped into the middle of this discussion so probably I'm speaking
totally out of context...

This is exactly one major advantage of Rust traits I have been trying to explain, thanks for putting it up in much more understandable way :)

Consider the following:

    int foo(T: hasPrefix)(T t) {
       t.prefix();    // ok
       bar(t);        // error, hasColor was not specified for T
    }

    void bar(T: hasColor)(T t) {
       t.color();
    }

Now consider a deeply nested chain of function calls like this. At the bottom, one adds a call to 'color', and now every function in the chain has to add 'hasColor' even though it has nothing to do with the logic in that function. This is the pit that Exception Specifications fell into.

I can see these possibilities:

1. Require adding the constraint annotations all the way up the call tree. I believe that this will not only become highly annoying, it might make generic code impractical to write (consider if bar was passed as an alias).

2. Do the checking only for 1 level, i.e. don't consider what bar() requires. This winds up just pulling the teeth of the point of the constraint annotations.

3. Do inference of the constraints. I think that is indistinguishable from not having annotations as being exclusive.



Fun begins:

        void foo(T)(T t)
        if(hasPrefix!T || hasSuffix!T){
                static if(...)t.prefix();
                else t.suffix();

                mixin("t.bar();");
        }

Reply via email to