foreach problem
    BCS 
    nothing at pathlink.com
       
    Fri Jan  5 10:37:02 PST 2007
    
    
  
Frits van Bommel wrote:
> Dejan Lekic wrote:
>> Compiling foreach_bug.d produces an error, while compiling 
>> foreach_ok.d does
>> not. IMHO that is a bug - it is clearly stated in current 
>> specification of The
>> Language 
>> (http://www.digitalmars.com/d/statement.html#ForeachStatement) that
>> variable can be declared outside.
> 
> No it's not. I just reread all of it. I didn't find any mention of that, 
> nor a code sample that would support your case.
> Furthermore, if it _did_ state that somewhere, it'd be a 'bug' in the 
> specification, not in the compiler.
> 
The spec actually asserts the exact opposite (but you really have to 
look carefully to see it).
"At the start of each iteration, the variables _declared_ by the 
ForeachTypeList  are set to be a copy of the elements of the aggregate. 
If the variable is inout, it is a reference to the contents of that 
aggregate."
Based on this (note emphasis) the foreach is always declaring the 
variable. This can only be true if it is a new variable created at that 
point.
OTOH In many cases allowing exactly the usage you are trying for would 
make many things a lot easier. I would like to see it added.
int[] a = ...;
int e;
foreach(e_; a)
{
	if(0 == e_ % 2)
	{
		e = e_
		break;
	}
}
vs.
int[] a = ...;
int e;
foreach(e; a) if(0 == e % 2) break;
To avoid some bugs when doing this unintentionally, maybe require 
something like this:
int[] a = ...;
int e;
foreach(alias e; a) if(0 == e % 2) break;
    
    
More information about the Digitalmars-d-bugs
mailing list