On Monday, 22 June 2015 at 13:42:41 UTC, Steven Schveighoffer wrote:
On 6/22/15 2:27 AM, Joseph Cassman wrote:
On Sunday, 21 June 2015 at 23:02:38 UTC, Andrei Alexandrescu wrote:
[...]

I was trying to understand how it could work with array slices. For example, I was thinking of code similar to the following from TDPL p. 103:

import std.conv, std.stdio;
int main(string[] args) {
   args = args[1 .. $];
   while (args.length >= 2) {
     if (to!int(args[0]) != to!int(args[$ - 1])) {
       writeln("not palindrome");
       return 1;
     }
     args = args[1 .. $ - 1];
   }
   writeln("palindrome");
   return 0;
}

Is the slice above considered a range? If so then it seems that (4) is already used a lot in existing D code. If it is not, then will slices of the possible future library implementation of arrays be considered ranges?

I cannot see all difficulties arising from allowing (4), but I imagine code complexity will increase as a result. Perhaps the compiler can special case arrays to avoid possible issues making (4) allowable for
all containers?

No, what Andrei is referring to is modification of the referenced structure (not just the elements). In other words, imagine removing 5 elements from the array while you are doing this iteration, and pushing all the other elements up.

Modification of the range itself is not ever going to be illegal! A range is for iterating, and if you need to iterate it, you must modify it.

Note also that although the above sample code uses a string which is technically a range, it's not used with range primitives (front back, popFront, popBack), and really it should be used that way to support UTF.

-Steve

Yeah, that's not the input range troika. Wasn't clear on how slicing plays into the matter. Thanks Steve.

I think a developer should understand what is trying to do with a particular type of collection and so am fine with undefined behavior if a collection is modified while iterating. An error resulting from such an invalid state does not seem exceptional to me, rather a logic error on the part of the developer. So exceptions do not seem a fit to me here. I don't like the proliferation of try-catch blocks in Java. Would also like to use collections in nogc code as well, as much as is possible.

If assistance is added from the compiler a la contracts or asserts to catch such logic errors than that is pretty cool. Compile-time is a nice plus but if too difficult it could be left to the developer's responsibility just fine, IMO.

Joseph

Reply via email to