I was reading the most recent article on perl.com, and a code segment
reminded me of something I see rather often in code that I don't like.
Here's the code, Perl6ized:

    ... ;
    my $is_ok = 1;
    for 0..6 -> $t {
        if abs(@new[$t] - @new[$t+1]) > 3 {
            $is_ok = 0;
            last;
        }
    }
    if $is_ok {
        push @moves: [$i, $j];
    }
    ...

I see this idiom a lot in code.  You loop through some values on a
condition, and do something only if the condition was never true.
$is_ok is a control flow variable, something I like to minimize.  Now,
there are other ways to do this:

    if (0..6 ==> grep -> $t { abs(@new[$t] - @new[$t+1]) })
    { ... }

But one would say that's not the cleanest thing in the world.

Python pulled this idiom out in to the syntax (yay them), with C<else>
on loops.  The else block on a python loop executes only if you never
broke out of the loop.  That's a great idea.

So, in Perl's postmodern tradition, I think we should steal that idea.
I'm a little uneasy about calling it C<else>, though.  Maybe C<FINISH>
would do, making the example:

    for 0..6 -> $t {
        if abs(@new[$t] - @new[$t+1]) > 3 {
            last;
        }
        FINISH { 
            push @moves: [$i, $j];
        }
    }

I'd also like to say that while converting the rest of this sub to Perl
6, I realized how much I love the ..^ and ^.. operators.  I was
wondering whether people had forgotten about them :-). 

Luke

Reply via email to