Yes; but then I think that something like infix:<rescue> probably just ends up as a macro somehow. I just didn't know the state of macros in Perl 6 well enough to be able to head down that route. :)
Pm On Fri, Aug 03, 2018 at 10:32:41PM +0200, Elizabeth Mattijsen wrote: > Sometimes I wish we could use Thunk as a type: > > sub infix:<rescue>(Thunk:D $block, $otherwise) { } > > which would then allow you to do: > > my $sixdivzero = divide(6,0) rescue -1; # note absence of curlies > > > > One can wish, can’t one? > > > Liz > > > On 3 Aug 2018, at 22:18, Patrick R. Michaud <pmich...@pobox.com> wrote: > > > > Maybe something like...? > > > > $ cat t.p6 > > > > sub infix:<rescue>(Callable $block, $otherwise) { > > CATCH { return $otherwise; } > > $block(); > > } > > > > sub divide($a, $b) { die "Zero denominator" if $b == 0; $a / $b } > > > > my $sixdivzero = { divide(6,0) } rescue -1; > > say "6/0 = ", $sixdivzero; > > > > my $sixdivtwo = { divide(6,2) } rescue -1; > > say "6/2 = ", $sixdivtwo; > > > > > > $ perl6 t.p6 > > 6/0 = -1 > > 6/2 = 3 > > > > > > Or if you prefer a prefix form, just declare "rescue" as a normal sub and > > then do: > > > > rescue { divide(6,2) }, -1; > > > > Pm > > > > On Fri, Aug 03, 2018 at 08:34:44PM +0100, Simon Proctor wrote: > >> Hi Sean. I hope my second answer in stackoverflow gets closer to what you > >> want. > >> > >> I am still trying to think of a more idiomatic way of handling to > >> situation. > >> > >> > >> > >> On Fri, 3 Aug 2018, 19:29 Sean McAfee, <eef...@gmail.com> wrote: > >> > >>> I posted about this subject on Stack Overflow yesterday[1], but I chose a > >>> poor example of something that raises an exception (dividing by zero, > >>> which > >>> apparently doesn't necessarily do so) on which the answers have mostly > >>> focused. > >>> > >>> I was looking for a way to evaluate an expression, and if the expression > >>> threw an exception, for a default value to be provided instead. For > >>> example, in Ruby: > >>> > >>> quotient = begin; a / b; rescue; -1; end > >>> > >>> Or in Lisp: > >>> > >>> (setq quotient (condition-case nil (/ a b) (error -1))) > >>> > >>> Not having written much exception-related code in Perl 6, I hoped that > >>> this might work: > >>> > >>> sub divide($a, $b) { die "Zero denominator" if $b == 0; $a / $b } > >>> my $quotient = do { divide($a, $b); CATCH { default { -1 } } }; > >>> > >>> It doesn't, though. As far as I can tell, the value to which a CATCH > >>> block evaluates is ignored; the only useful things one can do in such a > >>> block are things with side effects. Long story short, I eventually came > >>> up > >>> with this: > >>> > >>> my $quotient = do { my $q; { $q = divide($a, $b); CATCH { default { $q > >>> = -1 } } }; $q }; > >>> > >>> That's far more verbose than I've come to expect from Perl 6. Is there > >>> some more concise way of expressing this logic? > >>> > >>> The doc page on exceptions mentions try, eg: > >>> > >>> my $quotient = try { divide($a, $b) } // -1; > >>> > >>> That works in this specific case, but it seems insufficient in general. > >>> The function might validly return an undefined value, and this > >>> construction > >>> can't distinguish between that and an exception. Also, it wouldn't let me > >>> distinguish among various exception cases. I'd have to do something like: > >>> > >>> class EA is Exception { } > >>> class EB is Exception { } > >>> sub divide($a, $b) { (EA, EB).pick.new.throw if $b == 0; $a / $b } > >>> > >>> my $quotient = do { my $q; { $q = divide($a, $b); CATCH { when EA { $q > >>> = -1 }; when EB { $q = -2 } } }; $q }; > >>> > >>> > >>> [1] > >>> https://stackoverflow.com/questions/51644197/returning-values-from-exception-handlers-in-perl-6/51670573 > >>> > >> -- > >> Simon Proctor > >> Cognoscite aliquid novum cotidie