foreach multiple loop sugar
TheHamster via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Aug 18 09:31:29 PDT 2015
On Tuesday, 18 August 2015 at 15:51:55 UTC, ixid wrote:
> Though sugar seems to be somewhat looked down upon I thought
> I'd suggest this- having seen the cartesianProduct function
> from std.algorithm in another thread I thought it would be an
> excellent piece of sugar in the language. It's not an earth
> shattering change but it makes something very common more
> elegant and reduces indentation significantly for multiple
> nested loops. Braces make nested loops very messy and any
> significant quantity of code in the loop body benefits from not
> being in a messy nesting.
>
> import std.algorithm, std.range, std.stdio;
>
>
> void main() {
> // Standard
> foreach(i; 0..10)
> foreach(j; 0..10)
> foreach(k; 0..10)
> writeln(i, j, k);
>
> // Better
> foreach(k, j, i; cartesianProduct(10.iota, 10.iota, 10.iota))
> writeln(i, j, k);
>
>
> // Sugar
> foreach(k, j, i; 0..10, 0..10, 0..10)
> writeln(i, j, k);
>
> //Following brace rules
> // Standard
> foreach(i; 0..10)
> {
> foreach(j; 0..10)
> {
> foreach(k; 0..10)
> {
> writeln(i, j, k);
> }
> }
> }
>
> // Sugar
> foreach(k, j, i; 0..10, 0..10, 0..10)
> {
> writeln(i, j, k);
> }
>
You can create a multi-loop quite easily in template form for
avoid the nesting.
Essentially use an array for the the index instead of individual
variables, e.g.,
mutliloop([0..10, 0..10, 0..10], (i)=>
{
writeln(i[0], i[1], i[2]);
});
I'm not sure how efficient it is but essentially achieves what
you are asking without too much overhead. Obviously having good
language support is always nice...
More information about the Digitalmars-d-learn
mailing list