About foreach loops

KennyTM~ kennytm at gmail.com
Wed Jun 15 09:51:55 PDT 2011


On Jun 15, 11 23:23, Caligo wrote:
> On Wed, Jun 15, 2011 at 9:44 AM, KennyTM~<kennytm at gmail.com>  wrote:
>> On Jun 15, 11 22:35, Caligo wrote:
>>>
>>> You can create a temporary if you like:
>>>
>>>    foreach(i; 0..10){
>>>      int ii = i + 1;
>>>      writeln(ii, " ");
>>>    }
>>>
>>> Which outputs:
>>> 1 2 3 4 5 6 7 8 9 10
>>>
>>>
>>> The problem with trying to "fix" foreach is that it would create
>>> problems of its own.  The following code would not behave correctly:
>>>
>>>    foreach(i; 0..10){
>>>      if(i&    1)
>>>        i += 1;
>>>      writeln(i, " is even.");
>>>    }
>>>
>>> not to mention all the code that's already using foreach.
>>
>> If the code rely on the 'implicit ref' behavior of 'i', the code is doing it
>> wrong. The spec never mentioned what happened when the variable is modified
>> in a ForeachRangeStatement. I believe it is more sane if modifying 'i' is
>> disallowed unless 'ref' is used.
>>
>
>
> This should be a compile time error:
>
>    foreach(i; 0..10){
>      i += 1;
>      write(i, " ");
>    }
>
> This should be legal.
>    foreach(ref i; 0..10){
>      i += 1;
>      write(i, " ");
>    }
>
> Is that the general consensus here?

A simple patch for this:

https://github.com/kennytm/dmd/compare/master...const_foreach_range


More information about the Digitalmars-d mailing list