Foreach Range Statement

Bill Baxter dnewsgroup at billbaxter.com
Mon Jul 23 00:53:08 PDT 2007


Reiner Pope wrote:
> Bill Baxter wrote:
>> Jarrett Billingsley wrote:
>>> "Xinok" <xnknet at gmail.com> wrote in message 
>>> news:f80qof$2n0l$1 at digitalmars.com...
>>>
>>>> foreach(i; 0..100)
>>>
>>> This is almost identical to the syntax in MiniD:
>>>
>>> for(i: 0 .. 100)
>>>
>>> It could be done with for or foreach; I just chose for because 
>>> normally you use for loops to iterate over ranges of integers.
>>>
>>> You can also come up with a pretty simple short-term solution that'll 
>>> be fairly efficient (though not as efficient as if the compiler were 
>>> aware of this kind of loop intrinsically) by making a struct 'range' 
>>> which has a static opCall to construct a range and an opApply to 
>>> iterate over the values, so that it'd look like:
>>>
>>> foreach(i; range(100))
>>>
>>> Which isn't terrible at all. 
>>
>> And it has the advantage of being more extensible.  And for allowing 
>> ranges to be treated as first class entities that can be passed around 
>> and manipulated.  But no, instead we get another one-trick pony.
>>
>> --bb
> That was my first thought, too.
> 
> In the "Array Slice Ranges" thread, several people mentioned first-class 
> ranges:
> 
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=43865 
> 
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=43904 
> 
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=43905 
> 
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=43954 
> 
> 
> Your implementation, Bill, seems to be just right, and gives you foreach 
> over ranges for free.

Thanks.  I think Oskar Linde had a nice version too.  I seem to remember 
thinking there were a few things in his that I should borrow.

> What's wrong with adding that to the language, but templated and with 
> nice syntax?
> 
> type name                                 literal
> int..int  (range of int)                  1..5
> int..double   (range of int to double)    1..5.0
> int..int:int  (stepped range)             5..1:-1
> 
> (I'm not sure of the use of mixed-type ranges, but this seems the most 
> intuitive syntax. Since most ranges are probably of one type, how about 
> allowing a symbol to denote "same type again". Any of the following 
> could mean int..int:   int..#,   int.._, int..$)

Having two different types for it seems odd.  Just plain int.. would 
make more sense to me.  I really like that 5..1:-1 syntax though!  Was 
that mentioned before?  Something about all the colons in Pythons range 
literals always makes me uneasy.  a:b:c -- is that a to c stepping by b? 
  Or a to b stepping by c?  In Python it's the latter.  In Matlab I 
think it's the former.  Which is probably why I always feel a little 
uneasy when I see it.  But a..b:c is much clearer!  Obviously it's from 
a to b, so c must be a step.  And the colon looking like the two dots 
stood on end -- lovely.

> As several people have pointed out, this also fixes mixed 
> indexing/slicing problems for multi-dimensional arrays.

To give Walter the benefit of the doubt, perhaps this new addition *is* 
the first stage of just such a master plan to make range literals first 
class citizens.


--bb



More information about the Digitalmars-d mailing list