Questions about the slice operator

Jacob Carlborg doob at me.com
Wed Apr 4 03:06:33 PDT 2012


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


More information about the Digitalmars-d-learn mailing list