Wider tuple design discussion

Pelle pelle.mansson at gmail.com
Tue Aug 2 07:28:12 PDT 2011


On Tue, 02 Aug 2011 15:15:52 +0200, bearophile <bearophileHUGS at lycos.com>  
wrote:

> 5.1) The most basic one is unpacking a tuple locally, inside a function.
> 5.2) Another common situation is unpacking a small tuple inside a  
> foreach statement, when you iterate on a collection of tuples.

I would argue these two are the most important ones.

> 5.3) Another usage (quite common in Haskell and similar languages) is to  
> unpack a tuple in the signature of a function. Haskell even allows to  
> give names at the same time to both fields and to the whole tuple.

This is less important, I think.

> Other operations are:
> 6) Slice a tuple like a Python/D array: tup[1..3]. (This is already  
> supported in D, but you can't use the normal slice syntax, you need to  
> use tup.slice!(1, 3) ).
> 7) Concat two or more tuples (using ~ and ~= operators).

Note that ~= cannot work, as the result of the concatenation has a  
different type than the left hand side. (Unless, of course, the right hand  
side is the empty tuple :-)

> 5.3) This is already possible in D using the typetuple coming from a  
> tuple using the (undocumented?) .tupleof. But this has the problem of  
> losing some safety, this compiles with no errors:
>
> import std.typecons;
> void bar(int i, string s) {}
> void main() {
>     auto t1 = tuple(1, "foo");
>     bar(t1.tupleof);
>     auto t2 = tuple(1);
>     auto t3 = tuple("foo");
>     bar(t2.tupleof, t3.tupleof);
> }

This is because of the conflation of TypeTuple (the compiler thing) and  
Tuple (the sane type thing). That code works because .tupleof is a  
TypeTuple.

We need this functionality because of things like  
std.traits.ParameterTypeTuple (or indeed Tuple itself uses a TypeTuple  
internally).

The built in compiler tuple could use a new name, badly, to disperse the  
confused situation with sane tuples. AliasSequence or something :-)

> In Python there are more features similar to the point (5). Yo are  
> allowed to unpack a dynamic array too into variables, and even a lazy  
> generator. This is so handy and useful that I have suggested to allow  
> the same thing in D too:
> http://d.puremagic.com/issues/show_bug.cgi?id=6383

I think that as well as tuples, any range should be unpackable, and I  
think it should be implemented via syntactic rewrite.

Translate this:

auto (a, rest...) = myRange;

into

static assert (isInputRange!myRange);
assert (!myRange.empty);
auto a = myRange.front;
myRange.popFront;
rest = myRange;

Equivalently with bidirectional ranges, and any number of unpacked  
elements.


I wonder how the auto(...) syntax works with existing variables. For  
example, in python:

>>> a, b = b, a # swap!


More information about the Digitalmars-d mailing list