On Mon, 13 Feb 2017 21:04:37 -0800, raiph wrote:
> This comment is technically redundant. And maybe not helpful. I
> apologize if it's annoying to anyone.

Not annoying, but I feel we all have thoroughly confused bdfoy by now :P

Some minor corrections:

> 4.1 `sink some.expression;`
> 
> In stark contrast to implicit sink context, explicitly sinking
> `some.expression` causes Perl 6 to silently throw away whatever value
> is returned, even a Failure.

That's inaccurate. `sink Failure.new` will explode the Failure, just
like sinking it implicitly would. The behaviour you describe is a bug
that was fixed in 2016.12 release.

> 4.2 `try some.expression;`
> 
> This stores any Failure in `$!`

That will store the exception the Failure contained in $!,
not the Failure itself.

> 4.3 `some.expression.so;`, `some.expression or True;` etc.
> (Though `so some.expression;` and `?some.expression;` don't work for
> some reason.)

Basically anything that ends up calling .Bool on Failure will mark it
as handled and make it non-explosive. Both `so` and `?`seem to work fine for me:

    <ZoffixW> m: say ?Failure.new
    <camelia> rakudo-moar b51a55: OUTPUT«False␤»
    <ZoffixW> m: say so Failure.new
    <camelia> rakudo-moar b51a55: OUTPUT«False␤»


> Aiui, this only became an exception because your calling code didn't
> signal "I've got this" by explicitly `sink`ing or `try`ing or testing
> a routine's return value.
> [...]
> I think that's `use fatal;`. See
> https://docs.perl6.org/language/control#fail

There are actually no failures involved in the original code. The throwage
(not failurage) happens when the *Proc* object gets sunk. Tacking
on .so sinks the produced Bool instead.

This means `try $proc.err.close` won't stop the explosion, because
`try` receives the `Proc` object and returns it; it then gets
sunk and explodes.

Cheers,
ZZ

Reply via email to