Luke Palmer wrote:

> I'd rather have an in-betweener block too. Loops like this are very
> common, and I hate doing "prefix" commas, if you know what I mean.  I
> realize NEXT often used for cleanup, so maybe you could introduse Yet
> Another block, BETWEEN (or SQUEEZE).
> 
> Or are we just going to have to deal with this fact?

We may just have to deal with the fact. Because there's a problem with
in-betweener blocks. Consider:

        my $filename;
        while get_next_filename($filename)  {
                FIRST   { print "<list>\n"  }
                my $fh = open $_ or die "Can't open $filename";
                NEXT    { close $fh }
                print extract_id($fh);
                BETWEEN { print (-d $filename ?? "/," :: ",") }
                LAST    { print "</list>\n" }
        }

This looks reasonable, but there's a bug.
        
The C<BETWEEN> block can't decide whether to execute until
it knows whether the loop is going to iterate again. And it can't
know *that* until it has evaluated the condition again. At which 
point, the $filename variable has the wrong value. :-(

The example is a little contrived perhaps, but it might be a common 
problem. For example, it happens here too:

        loop ($n=$from; $n<$to; $n+=$skip) {
                print $page[$n];
                BETWEEN { print "Skipping to page $( $n+$skip )\n"; }
        }

C<$n> is updated before the conditional test, but the C<BETWEEN>
block can't execute until after the conditional.

Don't get me wrong: I *like* the idea of a BETWEEN block.
I just think it's harder to get right (and *much* harder to explain)
than most people would expect.

Damian

Reply via email to