suggested change to foreach index

BCS BCS at pathlink.com
Thu Jun 8 10:08:59 PDT 2006


Deewiant wrote:
> Sean Kelly wrote:
> 
>>Deewiant wrote:
>>
>>>Sean Kelly wrote:
>>>
>>>>    void main()
>>>>    {
>>>>        int    i;
>>>>        char[] arr = "abc def";
>>>>
>>>>        foreach( i, c; arr )
>>>>        {
>>>>            printf( "%i\n", i );
>>>>            if(' ' == c)
>>>>                break;
>>>>        }
>>>>        printf( "\n%i\n", i );
>>>>    }
>>>
>>>It creates a new scope, just like for loops:
>>>
>>>int i = 5;
>>>for (int i = 0; i < 3; ++i)
>>>    writefln(i); // 0 to 2
>>>writefln(i); // 5
>>
>>Yes, but my example was equivalent to this (I thought):
>>
>>    int i = 5;
>>    for (i = 0; i < 3; ++i)
>>        writefln(i); // 0 to 2
>>    writefln(i); // 2
>>
>>ie, the lack of a type makes the "i=0" an assignment, not a declaration
>>with an initializer.  The i from the surrounding scope is used.  I
>>expected foreach to behave the same way, but apparently it doesn't.
>>
> 
> 
> I guess it's the type inference that makes it so confusing to some. Earlier,
> after all, we had to write:
> 
> foreach (int i, char[] c; arr)
> 
> Instead of the modern terse version:
> 
> foreach (i, c; arr)
> 
> In the longer version, it's presumably more clear that the i is a new "int i".


The suggested syntax
            vvv
foreach([[inout] index,] value ; ...

seems a bit odd to me. How about use "alias" instead?

int i;
foreach(alias i, v; arr){}



More information about the Digitalmars-d mailing list