About foreach loops
Timon Gehr
timon.gehr at gmx.ch
Wed Jun 15 10:09:40 PDT 2011
Steven Schveighoffer wrote:
> On Wed, 15 Jun 2011 10:35:33 -0400, Caligo <iteronvexor at gmail.com> 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.");
>> }
>
> That code relies on undocumented behavior. It's likely to fail on some
> other D compiler.
>
> We can't worry about existing code that uses undocumented "features" of
> dmd. It's utilizing the knowledge of how D rewrites the foreach
> statement, not how foreach is documented to work.
> [snip.]
Actually that *is* exactly as it is documented to work.
Any code exploiting it relies on documented behavior.
See TDPL p. 74:
foreach(<symbol>; <expression1> .. <expression2>) <statement>
is rewritten to:
{
auto __n = <expression2>;
auto symbol = true ? <expression1> : <expression2>;
for(; <symbol> < __n; ++<symbol>) <statement>
}
This change would introduce an inconsistency with TDPL.
Timon
More information about the Digitalmars-d
mailing list