On Thu, Dec 06, 2007 at 04:36:26PM -0800, Jonathan Lang wrote:
: Larry Wall wrote:
: > On Tue, Dec 04, 2007 at 08:40:10AM -0800, Jonathan Lang wrote:
: > : or (I think):
: > :
: > : method test ($value) {
: > : setup();
: > : when $value { doit() } #[smart-match the calling object $_ against
$value.]
: > : }
: >
: > I know it used to be that way back near the Dawn of Time, but methods
: > don't automatically topicalize anymore unless you explicitly name
: > one of the parameters '$_':
:
: Huh. I guess I need to review current standards for method
: declaration; last I'd checked, the invocant did not need to be
: explicitly named.
It doesn't. But explicitly giving it the name $_ requires that you
explicitly name it.
: > : (Question: assuming that the above is valid, would breaking out of the
: > : when block be the same as returning from the method? Or would it
: > : qualify as an abnormal termination of the method?)
: >
: > Well, according to S04:
: >
: > "If the smart match succeeds, C<when>'s associated block is
: > executed, and the innermost surrounding block that has C<$_>
: > as one of its formal parameters (either explicit or implicit)
: > is automatically broken out of."
:
: ...which didn't answer my question, since "returning from the method"
: and "having the method die" both qualify as breaking out of the method
: in my mind.
Given that this is describing the ordinary break behavior of ordinary switch
statements, and there is a long C tradition of using the term "break"
for a simple goto to the end of a switch, I think you're reading it a
little sideways from how most people will. Nevertheless...
: > So it merely returns normally from the method, which is what you'd
: > generally expect.
:
: This makes sense to me. Perhaps S04 could be updated to make this a
: bit more explicit? Also, can 'break' take a parameter? My gut
: instinct is "no"; if you want to break out of a method while
: specifying a return value, you should probably use 'return' instead of
: 'break'. Indeed, you may want to make this mandatory, much like the
: conjecture about forcing people to use 'next' or 'last' instead of
: 'break' when in a loop.
I will attempt to clarify. I've also tried to unify the syntax of
all the loop and switch exits with ".leave" so they all can be of
the form LABEL.oops($retval). That means that next, last, and break
can now optionally specify return values.
Larry