Re: Custom errors on subsets?
--- On Tue, 5/1/10, Jonathan Scott Duff perlpi...@gmail.com wrote: From: Jonathan Scott Duff perlpi...@gmail.com I'd imagine that the functionality will fall out of the ability to have nice failures because surely something like the following works now: subset Filename of Str where { $_ ~~ :f or fail No such file: '$_' } Perhaps s/fail/die/, but that seems like a means to your desired end. Ah, the die works fine. However, fail causes that sub call to be skipped altogether: subset Filename of Str where { $_ ~~ :f or fail $_ is not a filename }; sub foo (Filename $name) { say Houston, we have a filename: $name; } foo($*EXECUTABLE_NAME); say before; foo('no_such_file'); say after; Output: Houston, we have a filename: /Users/ovid/bin/perl6 before after Is this a bug or just documented behavior that I don't know about? Cheers, Ovid -- Buy the book - http://www.oreilly.com/catalog/perlhks/ Tech blog- http://use.perl.org/~Ovid/journal/ Twitter - http://twitter.com/OvidPerl Official Perl 6 Wiki - http://www.perlfoundation.org/perl6
Re: Custom errors on subsets?
On Tue, Jan 5, 2010 at 11:18 AM, Ovid publiustemp-perl6langua...@yahoo.com wrote: --- On Tue, 5/1/10, Jonathan Scott Duff perlpi...@gmail.com wrote: From: Jonathan Scott Duff perlpi...@gmail.com I'd imagine that the functionality will fall out of the ability to have nice failures because surely something like the following works now: subset Filename of Str where { $_ ~~ :f or fail No such file: '$_' } Perhaps s/fail/die/, but that seems like a means to your desired end. Ah, the die works fine. However, fail causes that sub call to be skipped altogether: subset Filename of Str where { $_ ~~ :f or fail $_ is not a filename }; sub foo (Filename $name) { say Houston, we have a filename: $name; } foo($*EXECUTABLE_NAME); say before; foo('no_such_file'); say after; Output: Houston, we have a filename: /Users/ovid/bin/perl6 before after Is this a bug or just documented behavior that I don't know about? fail just returns an uncalled exception. What does that do in a where block? -- Solomon Foster: colo...@gmail.com HarmonyWare, Inc: http://www.harmonyware.com
Re: Custom errors on subsets?
--- On Tue, 5/1/10, Solomon Foster colo...@gmail.com wrote: From: Solomon Foster colo...@gmail.com Is this a bug or just documented behavior that I don't know about? fail just returns an uncalled exception. What does that do in a where block? I knew it returned an uncalled exception, but I'm still not expecting the sub call to be skipped silently due to a constraint failure. Silent failures are bad :) Cheers, Ovid -- Buy the book - http://www.oreilly.com/catalog/perlhks/ Tech blog- http://use.perl.org/~Ovid/journal/ Twitter - http://twitter.com/OvidPerl Official Perl 6 Wiki - http://www.perlfoundation.org/perl6
Re: Custom errors on subsets?
On Tue, Jan 5, 2010 at 11:36 AM, Ovid publiustemp-perl6langua...@yahoo.com wrote: --- On Tue, 5/1/10, Solomon Foster colo...@gmail.com wrote: From: Solomon Foster colo...@gmail.com Is this a bug or just documented behavior that I don't know about? fail just returns an uncalled exception. What does that do in a where block? I knew it returned an uncalled exception, but I'm still not expecting the sub call to be skipped silently due to a constraint failure. Silent failures are bad :) Good point. :) -- Solomon Foster: colo...@gmail.com HarmonyWare, Inc: http://www.harmonyware.com
Re: Custom errors on subsets?
On Tue, Jan 05, 2010 at 11:52:42AM -0500, Solomon Foster wrote: : On Tue, Jan 5, 2010 at 11:36 AM, Ovid : publiustemp-perl6langua...@yahoo.com wrote: : --- On Tue, 5/1/10, Solomon Foster colo...@gmail.com wrote: : : From: Solomon Foster colo...@gmail.com : : Is this a bug or just documented behavior that I don't : know about? : : fail just returns an uncalled exception. What does : that do in a where block? : : I knew it returned an uncalled exception, but I'm still not expecting the sub call to be skipped silently due to a constraint failure. Silent failures are bad :) : : Good point. :) I think it's fine to return a failure, but we'll need to distinguish two different kinds of constraint checks, mandatory vs discretionary. In my Constraint $x = 42; the Constraint is mandatory, and should die if the constraint check returns a failure. In the typical multi-dispatch, however, you just want a failure to mean look elsewhere. (You can still force a die there if you really want it.) To the first approximation, a mandatory check requires a defined where return value, while a discretionary check only requires a true value. (Note that a constraint on the parameter of an only sub is already mandatory, not discretionary, at least in the sense that the call will fail if the binding is unsuccessful. So that probably falls out naturally, though perhaps loses track of the failure message currently.) Larry
Re: Custom errors on subsets?
On Tue, Jan 5, 2010 at 1:07 AM, Ovid publiustemp-perl6langua...@yahoo.comwrote: --- On Mon, 4/1/10, yary not@gmail.com wrote: From: yary not@gmail.com How about multi sub foo(Any $name) { die Houston, we have a major malfunction.} Looks like tha would work, but it forces the developer to remember to write this extra code every time they may have a constraint failure, if they forget, we're back to the old, cryptic message. It would be much nicer to be able to do this (psuedo-code, obviouly): subset Filename of Str where { $_ ~~ :f } :OnFail { No such file: '$_' } subset Celsius of Num where { $_ = -273.15 } :OnFail { Celsius temperature should be a Num = -273.15, not '$_' } With something akin to that, developers won't have to write extra boilerplate every time a constraint fails. Plus, the code is friendlier :) I'd imagine that the functionality will fall out of the ability to have nice failures because surely something like the following works now: subset Filename of Str where { $_ ~~ :f or fail No such file: '$_' } Perhaps s/fail/die/, but that seems like a means to your desired end. -Scott -- Jonathan Scott Duff perlpi...@gmail.com
Re: Custom errors on subsets?
Perhaps you could create an error function that temporarily sets the default error message (does perl 6 still have the $! variable?) and returns false; so: subset Filename of Str where { $_ ~~ :f or error ( No such file: '$_' ) } Of course, that's a rather narrowly-defined function, as it's intended only for use in one situation - that is, where a boolean test is likely to be used by the parser to determine whether or not Something Bad needs to happen. I can't think of any case other than custom error messages for subsets where this would happen... Personally, I'd prefer something more along the lines of: subset Filename of Str where { $_ ~~ :f; ERROR { No such file: '$_' } } That is, have the parser look inside where blocks (or any other block that might convert a falsehood to a failure) for an ERROR block that is intended to be executed just as the error is about to be triggered. The primary purpose would be to supply a customized error message (and for that reason, the return value should be a string that can be used as $!); but other possibilities would exist. -- Jonathan Dataweaver Lang
Re: Custom errors on subsets?
Would it make sense to have the failure bound to the function parameter rather than the subset? eg.: sub foo (Str $name where { $_ ~~ :f } else { die Houston, we don't have a file } ) { ... } Just a thought... On Tue, Jan 5, 2010 at 1:07 AM, Ovid publiustemp-perl6langua...@yahoo.comwrote: --- On Mon, 4/1/10, yary not@gmail.com wrote: From: yary not@gmail.com How about multi sub foo(Any $name) { die Houston, we have a major malfunction.} Looks like tha would work, but it forces the developer to remember to write this extra code every time they may have a constraint failure, if they forget, we're back to the old, cryptic message. It would be much nicer to be able to do this (psuedo-code, obviouly): subset Filename of Str where { $_ ~~ :f } :OnFail { No such file: '$_' } subset Celsius of Num where { $_ = -273.15 } :OnFail { Celsius temperature should be a Num = -273.15, not '$_' } With something akin to that, developers won't have to write extra boilerplate every time a constraint fails. Plus, the code is friendlier :) Cheers, Ovid -- Buy the book - http://www.oreilly.com/catalog/perlhks/ Tech blog- http://use.perl.org/~Ovid/journal/ Twitter - http://twitter.com/OvidPerl Official Perl 6 Wiki - http://www.perlfoundation.org/perl6 -- John ash Harrison