Super-dee-duper D features
Bill Baxter
dnewsgroup at billbaxter.com
Tue Feb 13 18:37:57 PST 2007
Andrei Alexandrescu (See Website For Email) wrote:
> Frits van Bommel wrote:
>> Andrei Alexandrescu (See Website For Email) wrote:
>>> Sean Kelly wrote:
>>>> What about:
>>>>
>>>> foreach (i ; coll1) (j ; coll2)
>>>> {
>>>> if( true )
>>>> continue i;
>>>> }
>>>>
>>>> ie. allow 'continue' to accept labels to specify which collection is
>>>> iterated. A 'continue' without labels would iterate both.
>>>
>>> I think that's a great idea, except that "continue to label" has the
>>> same syntax: http://digitalmars.com/d/statement.html#ContinueStatement
>>
>> Does that really matter? The compiler knows whether 'i' is a label or
>> a loop variable (presumably it can't be both at the same time?) so it
>> knows what to do. Note that the current "continue to label" wouldn't
>> help here since there's only one statement for a "double" iteration.
>> So the most natural way to specify which loop to continue would be to
>> specify the variable.
>
> That's a good point, but changing names could complicate maintenance.
>
>> By the way, would the new loop syntax allow more than two collections
>> to be simultaneously iterated?
>> That would indicate the need for a "continue i, j" as well, to specify
>> multiple variables.
>> On the other hand, with your proposed "continue foreach" clauses after
>> the main loop that would also require an exponential number of those
>> clauses for different sets of collections running out if you want to
>> handle all cases...
>
> That is correct. But it's not a real issue for a simple reason: the user
> would have to write the code. If they need to handle all cases, well,
> that's what they need to do one way or another. The foreach statement
> does not add anything to the equation.
Yes it does make a difference. In the iterator case I can use all of D
to determine how to resolve the fact that there are different lengths of
data. In the continue foreach scenario, I have only one recourse --
write all the continute foreach's I need.
Consider I want to add N vectors of potentially different lengths
together. With the right iterator solution I could get away with just:
foreach( iters,xs; multi_iter(a,b,c,d,e) )
foreach(it; iters)
if (!it.end) out[j] += xs[i];
With "continue foreach" I'm just going to give up and write a for loop.
> Of course, in most cases the user has some prior constraints on the
> sizes so they know which "continue foreach" sections must be written.
> Let me clarify that the continue foreach statements are optional, not
> required.
--bb
More information about the Digitalmars-d
mailing list