Re: Catching exceptions in expressions
Yes; but then I think that something like infix: 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:(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 wrote: > > > > Maybe something like...? > > > > $ cat t.p6 > > > > sub infix:(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, 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
Re: Catching exceptions in expressions
Sometimes I wish we could use Thunk as a type: sub infix:(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 wrote: > > Maybe something like...? > > $ cat t.p6 > > sub infix:(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, 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
Re: Catching exceptions in expressions
Maybe something like...? $ cat t.p6 sub infix:(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, 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
Re: Catching exceptions in expressions
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, 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
Catching exceptions in expressions
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