Thank you for your fast and detailed reply.

Larry Wall skribis 2005-01-29 11:08 (-0800):
> On Sat, Jan 29, 2005 at 05:59:40PM +0100, Juerd wrote:
> : Can last/redo be used outside loops? (i.e. with if or given)
> No, though of course what "loop" means is negotiable.  Effectively,
> anything that captures the appropriate control exceptions is a loop.

redo could be useful in subs or even file scope. 

    CATCH { when Fatal { reset; redo; } }

And in given, for those who don't like fall-through:

    GIVEN: given $foo {
        when /^0x/ { $_.=hex; redo GIVEN; }
        ...
    }

    # Heh, I guess here $_.=hex, $_=hex and $_=.hex all do the same
    # thing :)

> So there's some argument for keeping bare {...} as a do-once loop.
> (..) But this morning it occurs
> to me that if we defined C<do {...}> to be a do-once loop, it kind of
> naturally rules out putting an C<until> or C<while> modifier on it,
> since you then have conflicting loop specifications.

It also kind of naturally rules out that do { } is for grouping
statements in an expression, because it'd behave *very* differently in
void context. And wasn't Perl 6 supposed to weed out weird exceptions? :)

    $foo = %*ENV<FOO>;
    
    $foo = do { print "Foo: "; readline } until $foo.validate;  # valid
    do { print "Foo: "; $foo = readline } until $foo.validate;  # invalid?

Maybe it doesn't hurt to tell people who need a once-loop to just use
loop with last:

    loop {
        ...
        last;
    }

Those who find comfort in knowing beforehand that it'll only run once,
can use NEXT { last } :)
    

Juerd

Reply via email to