shorter foreach syntax - C++0x range-based for

Jonathan M Davis jmdavisProg at gmx.com
Mon Nov 1 09:07:29 PDT 2010


On Monday, November 01, 2010 06:16:47 Nick Treleaven wrote:
> There's a C++0x proposal for a range-based 'for' statement:
> http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html
> 
> The upcoming GCC 4.6 C++ compiler changes list support for this:
> http://gcc.gnu.org/gcc-4.6/changes.html
> 
> I think the syntax could be useful for D to shorten and improve on the
> status quo a little. Here's the C++ example:
> 
> int array[5] = { 1, 2, 3, 4, 5 };
> for (int& x : array)
>   x *= 2;
> 
> Currently D has:
> 
> int array[5] = [1, 2, 3, 4, 5];
> foreach (ref x; array)
>   x *= 2;
> 
> I think this is better:
> 
> for (ref x : array)
>   x *= 2;
> 
> Apart from being 4 chars shorter, I think it looks more natural using the
> ':' instead of ';'. A lesser benefit is it allows reuse of the 'for'
> keyword, making the 'foreach' keyword unnecessary.
> 
> Maybe this would be acceptable for D?

The current syntax has been around for quite a while, it's in TDPL, and making 
the change gives no significant improvement. Generally speaking, we're not really 
supposed to be making any major changes from what TDPL says without a really 
good reason. Saving a few characters is not a really good reason. foreach works 
just fine and is arguably clearer, since you know right away that you're dealing 
with a foreach loop rather than a for loop - and while similar, they _are_ 
semantically different. And I don't see why : would be better than ;. IIRC, Java 
uses one and C# uses the other and you have to remember which uses which when 
moving between the two. And if you're looking to save typing, ; has the 
advantage that you don't have to use the shift key.

If D had chosen to just reuse for, that would have been fine, but it didn't, and 
I think that it's fine as it is. Changing foreach to for would not be a 
productive change in the least.

- Jonathan M Davis


More information about the Digitalmars-d mailing list