[Issue 5489] New: std.typecons tuples dynamically iterable

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jan 26 04:54:30 PST 2011


http://d.puremagic.com/issues/show_bug.cgi?id=5489

           Summary: std.typecons tuples dynamically iterable
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2011-01-26 04:52:23 PST ---
std.typecons tuples are not arrays, and their items don't need to be all of the
same type. But in Python programming with tuples I have seen that once in a
while it's useful to iterate on their items.

Currently in D2 (DMD 2.051) you are allowed to iterate on tuple items, but this
is a "static foreach":

import std.stdio, std.typecons;
void main() {
    auto t = tuple(1, 2, 3, 4);
    /*static*/ foreach (x; t.tupleof)
        writeln(x);
}


This is dynamic:

import std.typecons, std.algorithm;
void main() {
    auto t = tuple(1, 2, 3, 4);
    auto total = reduce!q{a + b}([t.tupleof]);
    assert(total == 10);
}


But in some situations with usage of zip and other things it's not handy to
convert tuples in arrays in that way. So I'd like tuples made of the same type
of items (castable) to be iterable (a "static if" disables the range protocol
methods if std.traits.CommonType applied on the tuple items is void):

import std.typecons, std.algorithm;
void main() {
    auto t = tuple(1, 2, 3, 4);
    auto total = reduce!q{a + b}(t);
    assert(total == 10);
}


With sum() from bug 4725 it becomes:

import std.typecons, std.algorithm;
void main() {
    auto t = tuple(1, 2, 3, 4);
    auto total = reduce!sum(t);
    assert(total == 10);
}


Another hypotetical example usage:

import std.typecons, std.algorithm, std.range;
void main() {
    auto t1 = tuple(1, 2, 3, 4);
    auto t2 = tuple(10, 20, 30, 40);
    auto r = map!sum(zip(t1, t2));
    assert(r == [11, 22, 33, 44]);
}


Equivalent Python2 working code:

>>> t1 = (1, 2, 3, 4)
>>> t2 = (10, 20, 30, 40)
>>> map(sum, zip(t1, t2))
[11, 22, 33, 44]

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list