Interval foreach iteration variable

Jonathan M Davis jmdavisProg at gmx.com
Wed Dec 1 18:53:26 PST 2010


On Wednesday 01 December 2010 18:33:16 bearophile wrote:
> This post is just about foreach performed on a range like 0..10, and not
> about foreach in general (like forerach done on a iota(0,10). Note: the
> 0..10 syntax may even become syntax sugar for iota(0,10) and the compiler
> may recognize iota() calls and fully optimize it away).
> 
> This D2 program:
> 
> import std.stdio: write;
> void main() {
>     foreach (i; 0 .. 10) {
>         write(i, " ");
>         i += 1;
>     }
> }
> 
> 
> Outputs:
> 0 2 4 6 8
> 
> But for a person accustomed to Python that looks strange, this is a similar
> Python2 program:
> 
> from sys import stdout
> for i in xrange(10):
>     stdout.write("%d " % i)
>     i += 1
> 
> It outputs:
> 0 1 2 3 4 5 6 7 8 9
> 
> 
> What's good in allowing the D foreach iteration variable when it loops on a
> interval to be modified like that? I think it's a bit bug prone semantics.
> 
> foreach(a; b..c) semantics is not related to the for() semantics, foreach
> is not present in C language, so D foreach is free to have any sane
> semantics it desires.
> 
> So I think it's better the foreach interval iteration variable to be not
> mutable.
> 
> There are important C style guides that warn against modifying the loop
> variable inside the loop itself because it's not a very safe&clean thing
> to do (and if necessary to set a flag that the for loop tests to break).
> So what I'm suggesting here is not weird.
> 
> -------------------
> 
> I have recently added a related but different bug report:
> http://d.puremagic.com/issues/show_bug.cgi?id=5306

What I would have thought would be the case would be that if the index variable 
was ref, then altering changed which index you got on the next iteration, but 
that if it wasn't ref, changing it would do nothing - just how it works with the 
element variable. I definitely agree that the fact that changing the index 
variable when it's not marked as ref is inconsistent and undesirable behavior, 
but I don't agree that it should not be possible to do it by ref as your post 
implies.

- Jonathan M Davis


More information about the Digitalmars-d mailing list