I stumbled upon a very interesting problem. Consider an infinite range that generates the numbers 1, 2, 3, ...

That range doesn't have a "length" member. However, it is a random access range, which makes things rather interesting. Now consider I want to advance 10 steps in that range. Being an obedient D programmer I'd write:

auto r = iota(1);
// skip 10 steps
r = r[10 .. $];

Now this is very cool. If a range is infinite, I can use the $ symbol in the right position, but nothing else. So I tried to effect that and got the following to compile:

struct DollarType {}
enum DollarType __dollar = DollarType();

struct S
{
    void opSlice(uint, DollarType)
    {
    }
}

void main()
{
    S s;
    s[0 .. $];
}

This is cool because it allows detection of passing $. Now the problem is, I can't seem to get rid of the __dollar definition! Has anyone found a general-enough trick? I'd want a[...$...] to morph the $ into a.length *iff* a defines length, and go with the __dollar otherwise.


Thanks,

Andrei

Reply via email to