On Saturday, 25 July 2015 at 10:01:43 UTC, Walter Bright wrote:
On 7/24/2015 10:59 PM, Jonathan M Davis wrote:
In any case, looking at this, I have to agree with you that this is the same problem you get with checked exceptions / exceptions specifications - only worse really, because you can't do "throws Exception" and be done with it like you can in Java (as hideous as that is). Rather, you're forced to do the equivalent of listing all of the exception types being thrown and maintain that list as the code changes - i.e. you have to make the top-level template constraint list all of the sub-constraints and keep that list up-to-date as the sub-constraints change, which is a mess, especially with deep call stacks of templated functions.

Phew, finally, someone understands what I'm talking about! I'm really bad at explaining things to people that they aren't already familiar with.

I'm not sure, but I suspect this problem may cripple writing generic library functions that do one operation and then forward to the next (unknown in advance) operation in a chain.

Well, the caller then has to do deal with the fact that the result doesn't work with the next call in the chain, and at least in that case, the failures are at their level, not buried inside of calls that they're making. And this is exactly the sort of problem that we've had for quite a while where you try and do something like

auto result = rndGen().map!(a % 10).take(10).sort();

The result of take isn't random-access, but sort requires random-access, so you get a compilation failure - but it's clearly on this line and not inside of one of the calls that you're making, so it's pretty straightforward.

I guess that where the problem might come in (and maybe this is what you meant) is when you try and do a chain like that inside of a templated function, and you end up with a compilation failure, because the argument to that function resulted in one of the items in the chain failing. But I'm not sure that that's any different really from a line with a single function call failing due to the outer function's argument not working with it.

It also may completely torpedo Andrei's Design By Introspection technique.

I'm not sure what you mean here. Design by Introspection seems to be primarily for implementing optional functionality, and it couldn't be in the outer template constraint regardless, because it's optional. So, I don't really see how whether or not we put all of the sub-constraints in the main template constraint really affects DbI.

I do have to wonder about what Andrei means to do with DbI though, since he keeps bringing it up like it solves everything and should be used everywhere, whereas it seems like it would only to apply to certain areas where you're dealing with optional functionality, and a lot of code wouldn't benefit from it all. We're essentially using it with ranges already when we're implementing algorithms differently based on what type of range we're given or what extra capabilities the range has, so it obviously is showing its usefulness there, but the allocators is the only other case that I can think of at the moment where it would make sense to use it heavily. He sounds like he wants to use it everywhere, which I don't get at all.

- Jonathan M Davis

Reply via email to