On Sun, Nov 8, 2009 at 21:14, dsimcha wrote:
> function like in python. Which does something like
> zip(iota(1,bar.length),bar).

> I think the index variant would better be done as an enumerate()
Enumerate is a great idea.  It's probably much better than requiring every range
struct to mix something in to enable this behavior.  Thanks.

FWIW, I coded enumerate and such for D2, and will post them on dsource as soon as I can get my hands on svn. In a few days at most, I hope.

Personally, I then use a 'tuplify' template which takes a standard function and transforms it into a tuple-accepting one:
so if I have:

int foo(int a, double b, string c) {...}
tuplify!foo is :
int tfoo(Tuple!(int, double, string) t) { /* extracts a,b & c from t, and returns foo(a,b,c) */  }


so, as I can't unpack the tuple:

foreach(a,b,c ; zip(range1, range2, range3) {
      /* do something with foo on (a,b,c) */
}

I tuplify foo and do:

foreach (tup; zip(range1, range2, range3) {
   /* do something with tuplify!foo(tup) */
}
There is no real limit on the number of ranges that can be acted upon in parallel that way, though I admit the syntax is a bit cumbersome.

I also use unzip!index( someZip) to get back the original range from inside zip.

 
I guess the same thing could be applied to unpack().  Instead of making the range
implementer mixin something to enable this (he/she will probably forget and it
could lead to ambiguities), do it on the caller end.

Makes me wonder why noone thought of this until now, or maybe someone did and I
forgot.  How's:

foreach(fooElem, barElem; unpack(zip(foo, bar))) {}, or:

foreach(i, elem; enumerate(chain(foo, bar))) {} ?


Can that be done for more than two ranges? The syntax is so nice, I'd be deligthed to have that.


  Philippe