Damian Conway <[EMAIL PROTECTED]> writes:

> David Wheeler wrote:
>
>> Isn't that just:
>>     for @array_of_random_values_and_types, 'ok' -> $t {
>>         when 'ok' { yada(); last }
>>         last unless some_sort_of_test($t);
>>     }
>> IOW, the topic is only 'ok' when all of the items in the array have
>> been processed
>
> Unless, of course, the string 'ok' is also one of the random_values_and_types.
> Hence my alternative solution.

Or:

   my $guard = Object.new;
   for @array_of_random_values_and_types, $guard 
     -> { when $guard { yada(); last }
          last unless some_sort_of_test($_) }

If there's some danger of some weird equality thing somehow causing a
problem there, you might need to make a Guard class with a very strict
'=~' implementation, but otherwise I can't see any problem.

Of course, that's better if some_sort_of_test is actually a method,
because then it becomes:

   my $guard = class { method some_sort_of_test { yada() }}.new;

   for [EMAIL PROTECTED], $guard 
     -> { last unless .some_sort_of_test }

All of which means you can wrap it up in a macro and prove Simon's
point about what's syntax and what's CP6AN:

   macro unless_all( Block &test is parsed /<perl.expression>/,
                     Block &consequence, [EMAIL PROTECTED] ) 
     { my $guard = Object.new;
       for [EMAIL PROTECTED], $guard 
         -> { when $guard { &consequence() ; last }
              when &test { last } } }

But I've probably got the signature slightly wrong. 

Higher Order Functions/Methods/Macros are great aren't they? 






Reply via email to