Foreach Range Statement

Don Clugston dac at nospam.com.au
Mon Jul 23 00:50:29 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.
> 
> 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..$)

I don't think it make sense to have mixed type ranges. The normal promotion 
rules should apply. However...

Floating-point ranges are tricky. Should they be open-ended, or closed-ended? 
Consider
-real.infinity..real.infinity
Are the infinities part of the range? If not, how do you specify a range which 
includes infinity?

I think the convention "first_element .. last_element+1" cannot be extended to 
negative and floating-point numbers without creating an inconsistency. Which is 
quite unfortunate.





More information about the Digitalmars-d mailing list