Another day in the ordeal of cartesianProduct

Peter Alexander peter.alexander.au at gmail.com
Sat Oct 27 03:20:51 PDT 2012


On Friday, 26 October 2012 at 22:43:44 UTC, H. S. Teoh wrote:
> I'm getting a bit frustrated with the Phobos bugs related to 
> ranges and
> std.algorithm. I think we need to increase the number of 
> unittests. And
> by that I mean, GREATLY increase the number of unittests. Most 
> of the
> current tests are merely sanity tests for the most common usage
> patterns, most basic types, or tests added as a result of fixed 
> bugs.
>
> This is inadequate.

Unit tests are not the solution to this. There are too many range 
combinations and types to effectively unit test everything. What 
we need is proper semantic support for ranges (and other 
conceptual classes of types). For example, this should not 
compile:

void foo(Range)(Range r) if (isForwardRange!Range)
{
     r.popBack();
}

But it will, because of the way templates work in D -- nothing is 
checked until you try to use it.

Imagine I could compile non-template code like this:

void foo(int x)
{
     writeln(x.name);
}

Imagine you had to try to call it before the static type error 
was caught. This is not a way to write robust code, especially 
with the combinatorial explosion of range types that exist.

Template constraints are nice, but not enough. We really need 
something *like* the proposed C++ concepts, or just something 
analogous to interfaces. I should be able to write something like 
this:

void foo(ForwardRange Range)(Range r)
{
     r.popBack();
}

And *immediately* get a type error without having to instantiate 
it with a variety of different range types. This is the only way 
I can see these kinds of problems going away. Unit testing does 
not scale with exponential use cases.


More information about the Digitalmars-d mailing list