On Friday, 22 March 2013 at 07:05:03 UTC, Denis Shelomovskij wrote:
22.03.2013 1:13, bearophile пишет:
And in foreach:

foreach ((c, ref e); loa)


D already have undocumented[1] front tuple expansion in foreach over range:
---
import std.algorithm;
import std.stdio;

void main() {
    enum s = "this is an example for huffman encoding"d;
    foreach (c, n; s.dup.sort().release().group())
        writefln("'%s'  %s", c, n);
}
---

[1] http://d.puremagic.com/issues/show_bug.cgi?id=7361

I've run in to this a few times and it's very irritating. The lack of an explicit syntax introduces an ambiguity:

foreach (c, n; s.dup.sort().release().group())
    writefln("'%s'  %s", c, n);

should c be the index, or should the tuple be unpacked? Currently the tuple is unpacked. In the general case, there is no easy way of having n be the tuple and c be the size_t index.

Sure, you could write

foreach (size_t c, n; s.dup.sort().release().group())
    writefln("'%s'  %s", c, n);

forcing n to be a tuple, which I think should work ( but doesn't, with a lot of irrelevant error messages: http://dpaste.dzfl.pl/7589a472 ), but if the first element of the tuple is also type size_t then you have a true ambiguity.


tldr: If we're going to have tuple unpacking, we need some way of controlling it.

Reply via email to