goto

Nick Sabalausky a at a.a
Thu Feb 5 23:10:10 PST 2009


"Andrei Alexandrescu" <SeeWebsiteForEmail at erdani.org> wrote in message 
news:gmgb9u$qkg$1 at digitalmars.com...
>I was coding a simple Euclidean distance function with limit:
>
> double euclideanDistance(Range)(Range a, Range b, double limit)
> {
>     limit *= limit;
>     double result = 0;
>     for (; !a.empty; a.next, b.next)
>     {
>         enforce(!b.empty);
>         auto t = a.head - b.head;
>         result += t * t;
>         if (result >= limit) goto thatsit;
>     }
>     enforce(b.empty);
>   thatsit:
>     return sqrt(result);
> }
>
> How would an elegant goto-less approach look like? It should not duplicate 
> code, e.g. the call to sqrt.
>

I haven't looked at any of the replies yet, and euclidean distance and 
Ranges are things I'd have to look up (I haven't actually had a chance to 
look at the Range docs), but I would do something like this:

double euclideanDistance(Range)(Range a, Range b, double limit)
{
    limit *= limit;
    double result = 0;
    bool foundIt=false;
    for (; !a.empty && !foundIt; a.next, b.next)
    {
        enforce(!b.empty);
        auto t = a.head - b.head;
        result += t * t;
        if (result >= limit)
        {
            foundIt = true;
            break; // This line needed?
        }
    }

    if(!foundIt) // This line needed?
        enforce(b.empty);

    return sqrt(result);
}





More information about the Digitalmars-d mailing list