On 2012-04-04 04:11, Jonathan M Davis wrote:

foreach(i; 0 .. 5)

is more efficient only because it has _nothing_ to do with arrays. Generalizing
the syntax wouldn't help at all, and if it were generalized, it would arguably
have to be consistent in all of its uses, in which case

foreach(i; 0 .. 5)

would become identical to

foreach(i; [0, 1, 2, 3, 4])

and therefore less efficient. Generalizing .. just doesn't make sense.

Why couldn't the .. syntax be syntax sugar for some kind of library implement range type, just as what is done with associative arrays.

We could implement a new library type, named "range". Looking something like this:

struct range
{
    size_t start;
    size_t end;
    // implement the range interface or opApply
}

range r = 1 .. 5;

The above line would be syntax sugar for:

range r = range(1, 5);

void foo (range r)
{
    foreach (e ; r) {}
}

foo(r);

This could then be taken advantage of in other parts of the language:

class A
{
    int opSlice (range r); // new syntax
    int opSlice (size_t start, size_t end); // old syntax
}

I think this would be completely backwards compatible as well.

--
/Jacob Carlborg

Reply via email to