develooper Front page | perl.perl6.language | Postings from November 2003

Re: Control flow variables

Thread Previous | Thread Next
From:
Damian Conway
Date:
November 18, 2003 13:01
Subject:
Re: Control flow variables
Message ID:
3FBA88B4.1000102@conway.org
Luke Palmer started a discussion:


> 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.

Only because you overdid the sugar. :

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

is pretty clean.

But, in any case, handling exceptional cases are what exceptions are for:

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

As regards return values of control structures, I had always assumed that:

     * scalar control structures like C<if>, C<unless>, and C<given> return
       the value of the last statement in their block that they evaluated;

     * vector control structures like C<loop>, C<while>, and C<for> in a list
       context return a list of the values of the last statement each
       iteration evaluated;

     * vector control structures like C<loop>, C<while>, and C<for> in a scalar
       context return an integer indicating the number of times their block
       was iterated.

So we might also write:

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


Damian



Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About