What are the chances that D gets auto tuple unpacking for foreach loops before D2 goes gold? In other words, it would be nice to write:
uint[] foo = [1,2,3,4,5]; uint[] bar = [6,7,8,9,10]; foreach(a, b; zip(foo, bar)) { // Does what you think it does. } Also, how about foreach over ranges with an index variable? For example: foreach(index, elem; chain(foo, bar)) { // Does what you think it does. } If these aren't going to happen, would it be worth having in Phobos a std.mixin module (I've already considered such a thing a few times here) that would allow someone writing a range to add goodies like these to structs and classes with a single line of code? For example: struct MyRange { Tuple!(float, float) _front; bool _empty; typeof(_front) front() { return _front; } void popFront() { // do stuff. } bool empty() { return _empty; } mixin(UnpackTupleForeach); mixin(IndexForeach); } The mixin(UnpackTupleForeach) would make this work: foreach(float float1, float float2; MyRange.init) {} The mixin(IndexForeach) would make this work: foreach(size_t index, float floatTuple; MyRange.init) {} This would work via opApply, which some don't like for efficiency reasons. It's been shown a while back that, while opApply does have some overhead, it's pretty small and LDC actually optimizes it out.