> @@ -264,17 +264,34 @@ > The C<.next> and C<.last> methods take an optional argument giving > the final value of that loop iteration. So the old C<next LINE> > syntax is still allowed but is really short for C<next LINE:> using > -indirect object syntax. > +indirect object syntax. Any block object can be used, not just labels, > +so to return a value from this iteration of the current block you can say: > + > + &?BLOCK.next($retval);
Would this work for 'break'? In particular, do we need something to the effect of &?TOPIC in order to indicate the block that 'break' causes you to leave? > +[Conjecuture: a bare C<next($retval)> function could be taught to do > +the same, as long as C<$retval> isn't a loop label. Presumably multiple > +dispatch could sort this out.] Also, since positional parameters can be used as named parameters (I think), you could make the distinction between LABEL.next and next($retval) explicit if you ever encounter a situation where you need to return a label: next :return(LABEL) # passes LABEL as return value next LABEL # loops to next iteration of LABEL > +Since the final expression in a subroutine returns its value, it's > +possible to accidentally return a loop's return value when you were > +only evaluating the loop for its side effects. If you do not wish > to accidentally return a list from the final loop statement in a > subroutine, place an explicit return statement after it, or declare > a return type of C<Void>. With the advent of return values for next and last, you might also handle this by explicitly ending the loop with a 'next' that does not return a value. Question: should this be the default behavior for the statement 'next;', or should the programmer have to explicitly indicate that nothing is being returned (e.g., 'next void;')? -- Jonathan "Dataweaver" Lang