// released into public domain import std.stdio; template Tuple(T...) { alias T Tuple; } void main() { alias Tuple!(int, double) T; T t; t[0] = 5; t[1] = 15.0; mixin(Foreach( "x", "t", `x *= 3;` )); writefln("%s %s", t); // prints 15 45 } string Foreach(string param, string tuple, string code) { return "mixin(genForeachCode(`" ~ param ~ "`, " ~ tuple ~ ".length, `" ~ tuple ~ "`, `" ~ code ~ "`));"; } string itoa(uint val) { if (val > 9) return itoa(val / 10) ~ itoa(val % 10); char[] s = " ".dup; s[0] = cast(char) (val + '0'); return s; } string genForeachCode(string param, uint len, string tuple, string code) { string val = ""; for (int i = 0; i < len; i++) { string tupleElem = tuple ~ "[" ~ itoa(i) ~ "]"; val ~= "{ auto " ~ param ~ " = " ~ tupleElem ~ "; " ~ code ~ \n ~ tupleElem ~ " = " ~ param ~ "; }\n"; } return val; }