On Fri, Nov 13, 2009 at 12:09 AM, Don <nos...@nospam.com> wrote: > Bill Baxter wrote: >> >> We can pretty much already use __traits(compiles,{...}) to implement >> static interface checking. >> >> template checkInterface(T) { >> enum bool checkInterface = >> __traits(compiles, >> { >> T x; >> // some code exercising various aspects of the interface >> }); >> } >> >> The main problem with this is that a static "implements interface" >> check is done like so: >> >> static assert(checkInterface!(myType)); >> >> And all it tells you is a single yes or no. It would help in >> debugging if you could somehow get the reason for the failure. >> >> So how to do it? All that comes to mind is something like the evil >> Errno from C. A global that gets set by the last failure. >> Let's call it __errmsg, but it could be a pragma, or a __traits thing. >> If you had that then you could write this: >> >> assertImplements!(checkInterface!(myType)); >> >> With: >> template assertImplements(bool v) >> { >> static if (!v) { >> pragma(msg, __errmsg); >> static assert(false); >> } >> } >> >> There are lots of ways you could provide such a concept-checker, but >> they all require the basic ability to get the reason for the >> __traits(compiles) failure. >> >> Any other thoughts about how to get the failure info? This is >> probably the main complaint against __traits(compiles), that there's >> no way to find out what went wrong if the code doesn't compile. Often >> it can just be a typo. I know I've spent plenty of time looking at >> static if(__traits(compiles, ...)) checks that weren't working only to >> discover I switched an x for a y somewhere. Or passed the wrong >> number of arguments. >> >> --bb > > I think you might be asking for: > > static try { > xxx; > } > catch( CompilerError[] errors){ > pragma(msg, "Failure in Frobozz!"); > pragma(msg, errors[0].msg); > }
Heh heh. Well I proposed something along those lines before, and it didn't catch on, so I decided to avoid mentioning it this time. :-) http://digitalmars.com/d/archives/digitalmars/D/static_try_catch_construct_would_be_helpful_66794.html But yeh, actually now that you mention it that handles both problems I brought up recently. 1) how to run code only if it compiles and avoid repeating yourself. (the original reason I proposed it) 2) how to get and report errors related to failure to compile some code. (this one I hadn't thought of back then) But yeh, it looks like that could solve both problems. --bb