Bring back foreach int indexes

Steven Schveighoffer schveiguy at gmail.com
Thu Mar 28 02:04:44 UTC 2024


On Monday, 11 December 2023 at 22:22:27 UTC, Quirin Schroll wrote:
> On Wednesday, 29 November 2023 at 15:48:25 UTC, Steven 
> Schveighoffer wrote:
>> On Wednesday, 29 November 2023 at 14:56:50 UTC, Steven 
>> Schveighoffer wrote:
>>> I don’t know how many times I get caught with size_t indexes 
>>> but I want them to be int or uint. It’s especially painful in 
>>> my class that I’m teaching where I don’t want to yet explain 
>>> why int doesn’t work there and have to introduce casting or 
>>> use to!int. All for the possibility that I have an array 
>>> larger than 2 billion elements.
>>>
>>> I am forgetting why we removed this in the first place.
>>>
>>> Can we have the compiler insert an assert at the loop start 
>>> that the bounds are in range when you use a smaller int type? 
>>> Clearly the common case is that the array is small enough for 
>>> int indexes.
>>
>>
>> For those who are unaware, this used to work:
>>
>> ```d
>> auto arr = [1, 2, 3];
>> foreach(int idx, v; arr) {
>>     ...
>> }
>> ```
>>
>> But was removed at some point. I think it should be brought 
>> back (we are bringing stuff back now, right? Like hex strings?)
>>
>
> Couldn’t you write a function `withIntIndex` or 
> `withIndexType!int` such that you can check the array is indeed 
> short enough?

Yes, but... it is still in the compiler, just deprecated (as I 
realized later in this thread). We can just undeprecate it (with 
some extra checks added).

Using a range/opApply wrapper also is going to bloat the code a 
bunch for not much benefit.

This really is a case of a problem being solved that didn't exist.

-Steve


More information about the Digitalmars-d mailing list