> (It may also be the case that I'm ignorant of what the best C++ tools today > do, though I'm pretty sure that these drawbacks are consequences of core C++ > design.)
Recent versions of Clang and GCC have much better diagnostics for template issues than compilers from a couple of years ago but you're right - C++ templates are fundamentally compile-time duck-typing and consequently the error messages are basically a stack trace. The recent 'Concepts Lite' proposal for C++1y addresses this by allowing template arguments to be allowing template args to be constrained [1]. Regards, Rob. [1] http://isocpp.org/blog/2013/02/concepts-lite-constraining-templates-with-predicates-andrew-sutton-bjarne-s On 17 September 2013 14:29, Felix S. Klock II <pnkfe...@mozilla.com> wrote: > Gokcehan (cc'ing rust-dev)- > > Correct, rust generics are not Turing-complete. (To my knowledge; I don't > think we've written the termination proof for the type-checker yet. :) > > Cheers, > -Felix > > > On 17/09/2013 15:25, Gokcehan Kara wrote: > > Felix, C++ template errors are indeed a joy(!) to deal with. I guess I also > would rather be explicit than to have cryptic error messages that are pages > long. You're also right about the absence of errors without the client code > which makes sense in a context of safety. > > It was the first time I heard about SFINAE. It reminds me of > turing-completeness proofs of C++ templates. Does that mean rust generics > are not turing complete? > > Gokcehan > > > On Tue, Sep 17, 2013 at 3:28 PM, Felix S. Klock II <pnkfe...@mozilla.com> > wrote: >> >> Gokcehan- >> >> My understanding is that C++, due to its policy of SFINAE [1], usually >> provides error feedback after the template has been fully instantiated and >> the fully instantiated version fails to compile. This can lead to hard to >> debug compile-time failures. >> >> Good compilers can help with dissecting the output you get in this case, >> but it is still a real pain to decode in my experience, especially when you >> have nests of template code written in terms of other template code. Since >> the template parameters do not have bounds, it is not possible for a >> compiler to provide any error feedback given a template definition alone >> (with no client code), and its difficult for the compiler to provide good >> error feedback that is described solely in terms of the definition: you are >> doomed to thinking about the intermingling of the definition with the >> particular instantiation. >> >> Requiring explicit bounds means that the compiler can provide good error >> messages at the point where the parameterized class is *defined* (even in >> the absence of client code!) rather than delaying to the point where the >> parmeterized class is fully instantiated. This provides me with more >> confidence that the parametric code I write is actually going to compose >> properly with other implementations of the trait-bounds in terms of which I >> have written my code. >> >> That advantage alone is enough to justify this choice for *me*. There may >> be other justifications that I am overlooking. >> >> (It may also be the case that I'm ignorant of what the best C++ tools >> today do, though I'm pretty sure that these drawbacks are consequences of >> core C++ design.) >> >> Cheers, >> -Felix >> >> [1] SFINAE: >> http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error >> >> >> On 17/09/2013 13:34, Gokcehan Kara wrote: >> >> Hello, >> >> I have met rust a few days ago and let me pay my respects first for making >> such a powerful language. I really hope to succeed making some contribution >> in the upcoming days. >> >> I was reading the tutorial (http://static.rust-lang.org/doc/tutorial.html) >> specifically the section 16.3 and I was wondering if there's a rationale >> behind making generic bounds explicit. For example in C++ I can do: >> >> // clang++ asd.cc -std=c++11 -Weverything -Wno-c++98-compat -g && >> ./a.out >> #include <iostream> >> #include <vector> >> using namespace std; >> >> class Klass { >> public: >> void print() { cout << "printing the thing" << endl; } >> }; >> >> template <typename T> void print_all(vector<T> &things) { >> for (auto thing : things) { >> thing.print(); >> } >> } >> >> int main() { >> vector<Klass> v1; >> >> v1.push_back(Klass()); >> v1.push_back(Klass()); >> v1.push_back(Klass()); >> >> print_all(v1); // no errors >> >> vector<int> v2; >> >> v2.push_back(1); >> v2.push_back(2); >> v2.push_back(3); >> >> print_all(v2); // /tmp/asd.cc:18:10: error: member reference base >> type 'int' >> // is not a structure or union/tmp/asd.cc:37:3: note: >> in >> // instantiation of function template specialization >> // 'draw_all<int>' requested here >> >> return 0; >> } >> >> and it gives me the necessary error at compile time. To my limited >> knowledge, this is also statically dispatched so should not cause any >> overhead. >> >> I haven't used Haskell much but I know a little bit of Scala. In Scala you >> need to be explicit because generics are compiled once to run with different >> types. As far as I understand, rust compiles different copies for each type >> (monomorphizing?) just like C++ so it might be possible to be implicit in >> rust as well. >> >> Having said that, I'm not sure if being explicit is necessarily a bad >> thing. It sure looks good for documenting and I haven't thought of any cases >> where it falls short except maybe when a function of the same name is >> implemented in different traits. >> >> Am I failing to see the obvious? >> >> Thanks in advance, >> Gokcehan >> >> >> _______________________________________________ >> Rust-dev mailing list >> Rust-dev@mozilla.org >> https://mail.mozilla.org/listinfo/rust-dev >> >> >> >> -- >> irc: pnkfelix on irc.mozilla.org >> email: {fklock, pnkfelix}@mozilla.com >> >> >> _______________________________________________ >> Rust-dev mailing list >> Rust-dev@mozilla.org >> https://mail.mozilla.org/listinfo/rust-dev >> > > > > -- > irc: pnkfelix on irc.mozilla.org > email: {fklock, pnkfelix}@mozilla.com > > > _______________________________________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/listinfo/rust-dev > _______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev