On 1/22/15 11:41 AM, Russel Winder via Digitalmars-d-learn wrote:
Playing with factorial implementations, as you do. I had a D
implementation using ulong. Not sensible obviously since overflow is a
bit of a problem. But the code worked, as did the tests. Now converting
to BigInt and…

The standard explicit iteration form uses a loop:

        for(i; 2..n+1)

for n = 0 or 1 this loop doesn't loop since the range is [,). However
for BigInt:

        for(i; two..n + one)

the loop starts at 0 and just keeps on going. This is clearly not good.

Am I having a mental breakdown or is this a real bug?



The issue:

import std.stdio;

struct S
{
    int x;
int opCmp(const S other) const { writeln("compare"); return x < other.x ? -1 : x > other.x ? 1 : 0;} bool opEquals(const S other) const { writeln("equals"); return x == other.x;}
    ref S opOpAssign(string op)(int other)
    {
        mixin("x " ~ op ~ "= other;");
        return this;
    }
}

void main()
{
    immutable S one = S(1);
    immutable S two = S(2);
    foreach(s; one..two) {}
}

output:
equals
equals

So foreach(S; one..two) translates to:

for(S x = one; x != two; x += 1)

which explains the infinite loop. I'm almost positive foreach(x; 1..2) uses comparison instead of equality to check for end condition.

-Steve

Reply via email to