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