isInfinite isInadequate

monarch_dodra monarchdodra at gmail.com
Wed Oct 17 05:33:53 PDT 2012


On Wednesday, 17 October 2012 at 12:18:32 UTC, Peter Alexander 
wrote:
> So, std.range.isInfinite checks if r.empty is a compile time 
> boolean equal to false. This works most of the time, but not 
> always. Some ranges are infinite, but cannot be determined to 
> be so at compile time (or even run time!)
>
> cycle([1, 2, 3]).until(4);    // infinite, but not isInfinite
> cycle(new int[0]);            // not infinite, but isInfinite
> collatzSequence(n).until(1);  // infiniteness an open problem!
>
> In short, isInfinite does not -- and cannot -- work as a way of 
> telling if a range is finite or infinite in general.
>
> On resolution is to take isInfinite at face value: it only 
> tells you if a range is statically determined to be infinite. 
> If isInfinite is false, it could still be infinite.
>
> This leaves us with the tricky cases like cycle(new int[0]). 
> There's three resolutions to this (as far as I can tell):
>
> 1. Change cycle to not be an infinite range.
> 2. Make cycle assert when the source range is empty.
> 3. Ignore this issue.
>
> Option 1 is sound, but kind of sucks, because generally cycle 
> is infinite.
>
> Option 2 is sound, but I don't like the idea of asserting on 
> logically valid input just because the problem is too hard.
>
> Option 3 is not sound, but may be practical. Perhaps these 
> edge-case, fake, infinite sequences are not worth worrying 
> about -- just let it slide and make other people worry about 
> the consequences.
>
> This Phobos pull request is relevant: 
> https://github.com/D-Programming-Language/phobos/pull/871
>
> Thoughts?

> cycle(new int[0]);            // not infinite, but isInfinite
> 2. Make cycle assert when the source range is empty.

Technically, while cycle does not assert, it will fail on the 
first call to front, either because of a divide by 0 (RA: 
index%length), or because of a call to an empty front.

We should add an assert. IMO.

--------
TBH, I do not see either as being a problem:

Technically, cycle([]) *is* isInfinite, but the program will 
assert because of a run-time error due to the user's logic. 
Nobody said that just because a range is infinite, that it can't 
ever fail...

Ranges that go on forever, but are not *isInfinite*. My stance on 
this point is that it is not a *big* problem either. I see it 
more as a runtime "infinite loop", rather than an compile time 
"infinite range". It's like a for loop where the run-time end 
condition will always be true.

That said, if the user *does* know the range will be infinite, I 
wouldn't be against having an "assumeInfinite" template function, 
that can take any range, and transform into an (assumed) compile 
time infinite range.


More information about the Digitalmars-d mailing list