chunks equivalent with unpacking?
bearophile
bearophileHUGS at lycos.com
Wed Jul 31 11:13:38 PDT 2013
Ali Çehreli:
> Once the element type is a tuple, 'tuple foreach' will expand
> them.
>
> foreach (x, y, z, w; /* a range that returns tuple of four
> */)
That part of the D design is not yet formalized, it's a special
case, and maybe it will need to be removed :-( It's a significant
design mistake introduced recently in D.
This is a first nonworking try:
import std.range: chunks, Chunks;
import std.stdio : writeln;
import std.string: format, join;
import std.typecons: tuple;
import std.typetuple: TypeTuple;
template Iota(int stop) {
static if (stop <= 0)
alias TypeTuple!() Iota;
else
alias TypeTuple!(Iota!(stop-1), stop-1) Iota;
}
struct TupleChunks(size_t n, CR) {
CR cr;
@property bool empty() { return cr.empty; }
void popFront() { cr.popFront; }
@property front() {
static string gen() {
string[] result;
foreach (i; Iota!n)
result ~= format("cr.front[%d]", i);
return result.join(", ");
}
mixin("return tuple(" ~ gen ~ ");");
}
}
TupleChunks!(n, Chunks!R) tupleChunks(size_t n, R)(R r) {
return typeof(return)(chunks(r, n));
}
void main() {
float[] arr = [ 0.0, 0.15, 0.0, 1.0,
0.25, -0.25, 0.0, 1.0,
-0.25, -0.25, 0.0, 1.0];
foreach (x, y, z, w; arr.tupleChunks!4)
x.writeln;
}
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list