Curious thoughts, regarding functional programming

Nick Sabalausky a at a.a
Wed Oct 12 13:56:55 PDT 2011


"Jacob Carlborg" <doob at me.com> wrote in message 
news:j740a6$2t8m$1 at digitalmars.com...
>
> When this delegate is called you want to both be able to just return from 
> the delegate but also return from "foo".
>
> iterate(1, 10 ; int a)
> {
>     if (a == 2)
> yield; // soft return, just returns from the delegate
>
>     else if (a == 4)
>         return; // hard return, return from both the delegate and the 
> function that called the delegate
> }
>
> Currently we only have "soft" returns from delegates.
>

Better (IMHO):

void foo()
{
    iterate(int a; 1, 10)
    {
        if (a == 2)
            continue; // return from just the delegate

        else if (a == 4)
            break; // return from both delegate and iterate

        else if (a == 6)
            return; // return from the delegate, iterate, and foo
    }
}

Ie, same syntax and semantics as foreach. Also, a couple new things that 
foreach doesn't have to deal with:

auto x = map(i; 1, 10)
{
    //continue; // Error: map's dg can't return void
    continue i*2; // OK
}
assert(x == [2, 4, 6, etc...]); // Conventiently ignoring ranges just for 
the sake of illustration

Of course, maybe it would be better to require "yield" in such a case (and 
maybe make "yield" synonymous with "continue" for void delegates?), but 
there's a lot of resistance against new keywords.

And, one last thing to take care of:

auto x = iterate(i; 1, 10)
{
    if(i == 4)
    {
        //break; // Error: need a return value
        break i*2; // OK
    }
}
assert(x == 8);




More information about the Digitalmars-d mailing list