On Friday, 21 February 2014 at 11:12:54 UTC, Regan Heath wrote:
 - enumerate is not as flexible as many people seem to think.

Only seeing the enumerate missing the ability to optionally add an index, but if you aren't adding an index you don't need enumerate.

On Fri, 21 Feb 2014 02:34:28 -0000, Jesse Phillips <[email protected]> wrote: I don't understand how this is "complex to support"? It's simple. It's a count, not an index unless the range is indexable. If people are going to expect an index here, they will expect one with enumerate as well - and are going to be equally disappointed. So, they need to be aware of this regardless.

You've provided 3 schemes to support this feature. This suggest there are several "right" ways to bring this into the language, while you prefer 1 someone may prefer 3.

At least with enumerate one will need to go to the documentation which explains enumerate doesn't provide an index... I haven't actually reviewed the docs.

I also don't find myself needing to count iterations very often, and I believe when I do, it is because I want to use that count as an index (possibly needing to add to some global count, but I don't need it enough to remember).

The justification for this change is the same as for enumerate.

It is common enough to make it important, and when it happens it's frustrating enough that it needs fixing.

I disagree. Enumerate is satisfactory (since it isn't in Phobos I can see it as frustrating).

For example, I find myself using an index to control loop behaviour, most often for detecting the first and last iterations than anything else. A counter will let you do that just as well as an index.

I wonder if there is a change to the algorithm which would allow you to not need the first/last iteration. I think this is the main reason I don't need a count, I've learned different ways to solve a problem. Which is beneficial since it leads to chaining functions instead of relying on foreach.

Sure. I personally find this idea compelling enough to warrant some breakage, it is simple, powerful and extensible and avoids all the issues of optional indexes with tuple expansion. But, I can see how someone might disagree.

Yes, I understand. But D is at a stage in its life when not every little detail can be polished. Believe me, D has other areas which need polishing but can't be.

string[double] AA;

or something similar, the type system no longer helps. But again, this seems pretty much uneventful.

Perhaps I wasn't clear, this would work fine:

string[double] AA;
foreach (string v; AA) {} // v is "value"
foreach (double k; AA) {} // k is "key"

or am I missing the point you're making?

if AA is changed to a double[string], then your value loop iterates on keys and your key loop iterates on values.

    foreach(i, v1, v2; tuple(0,1).repeat(10).enumerate)
        writeln(i, "\t", v1, "\t", v2);

This works today! And once enumerate is part of Phobos it will just need an import std.range to use it.

I tested all my claims about enumerate. You need it to import std.traits or else is(Largest(...)) will always be false.

Reply via email to