Chris:

Another drawback is that ranges demand a lot of boilerplate code. If properly implemented, there is a lot of code you have to write over and over again such as

if (isInputRange!Range && isInputRange!(ElementType!Range) &&
        is(ElementType!(ElementType!Range) == MyType))

I don't know if this could possibly be reduced. Or maybe it's just my lack of experience.

Two ways to reduce "boilerplate code" for that code:

One way to reduce "boilerplate code" is to introduce in D a C#-style "yield" that's syntax sugar to create Input Ranges:

yield!int inverseGrayCode() {
    yield 0;
    foreach (x; inverseGrayCode())
        if (x & 1) {
            yield 2 * x + 1;
            yield 2 * x;
        } else {
            if (x)
                yield 2 * x;
            yield 2 * x + 1;
        }
}


The yield keyword could also be used to denote a range of a type, to reduce this code of yours:

if (isInputRange!Range && isInputRange!(ElementType!Range) &&
    is(ElementType!(ElementType!Range) == MyType))

Bye,
bearophile

Reply via email to