foreach loop is undoubtedly elegant, however in daily use it is not efficient or versatile — I don’t envy the developers using the languages which dropped indexed
for loop without solid substitution. When you need an index — usually you have to
zip your collection with a range. Testing first or last element — a bit less common scenario — you need to add an extra scope with appropriate variables by hand. And adding nested continuation loop… — this is why I am glad C# still supports C-loop.
In Skila though, I am close to cover all the cases in a right way and have good reason not to introduce the old way of iterating. The performance is intact and you have concise syntax, starting from the basic form:
for elem in collection do ... end
With just a control label (for any kind of loop —
repeat-until) you can solve the common tasks:
loop: for elem in collection do stdOut.writeLine(loop.isLast); // `for` only stdOut.writeLine(loop.isFirst); stdOut.writeLine(loop.index); break loop; // here label is optional end
All three “members” are just plain variables — when not used by the user, they are scrapped from the code, when used — they don’t leak. Nested loops are less of the rush (besides, they require more internal rewiring) so I’ll add them sometime in the future.