Jim Cromie wrote:

> with p5, Ive often written
> 
> eval {} or carp "$@ blah";
> 
> it seems to work,

....modulo any block that returns false :-(


> and it reads nicer (to my eye) than
> 
> eval {}; if ($@) {}
> 
> but I surmise that it works cuz the return-value from the block is non-zero,
> for successful eval, and 0 or undef when block dies, not cuz of magical
> treatment of $@.

No. C<eval> return the last evaluated value in the block, unless an
exception is thrown, in which case it returns C<undef>. The problem with
the C<eval {...} or whatever> approach is that there are situations in
which the block can evaluate successfully but still return C<undef>.

On failure, C<eval> sets C<$@>, so careful programmers test it separately.
Of course, you *can* do that in a single statment if you want:

        eval {} or @! and carp "$@ blah";


        > I gather that ';' is unneeded in p6,

Err...no.


>  and given that $! is the 'exception'al topicalizer,

Only inside an explicit CATCH block.


> is this construct no longer reliant on the last value in the eval block ?

In Perl 6 C<eval BLOCK> becomes C<try BLOCK> and you'll still be able to write:

        try { ... } // carp $!;

but that will trip up if the final value of the C<try> block is C<undef>.

What you want is:

        try {
                ...
                CATCH { carp $! }
        }


> put another way, does the 'topicalizer' reflect the exit condition of
> the closure ?

Only in a CATCH block.

Damian

Reply via email to