Luke Palmer <[EMAIL PROTECTED]> writes: > On 6/7/05, Matt Fowles <[EMAIL PROTECTED]> wrote: >> On 6/7/05, Ingo Blechschmidt <[EMAIL PROTECTED]> wrote: >> > Hi, >> > >> > sub foo (Code $code) { >> > my $return_to_caller = -> $ret { return $ret }; >> > >> > $code($return_to_caller); >> > return 23; >> > } >> > >> > sub bar (Code $return) { $return(42) } >> > >> > say foo &bar; # 42 or 23? >> > >> > I think it should output 42, as the return() in the pointy >> > block $return_to_caller affects &foo, not the pointy block. >> > To leave a pointy block, one would have to use leave(), right? >> >> I don't like this because the function bar is getting oddly >> prematurely halted. > > Then let's put it this way: > > sub foo () { > for 0..10 { > when 6 { return 42 } > } > return 26; > } > > And if that didn't do it, then let's write it equivalently as: > > sub foo () { > &map(-> $_ { return 42 }, 0..10); > return 26; > } > > Do you see why the return binds to the sub rather than the pointy now? > > Also, we're going to be avoiding the return continuation problem with: > > sub foo() { > return -> { return 42 }; > } > > my $code = foo(); > say "Boo!"; > $code(); > > Says not: > > Boo > Boo > Boo > ... > > But: > > Boo > Can't return from subroutine that already returned at <eval> line 2.
My preference is for: Boo Boo Can't dereferene literal numeric literal 42 as a coderef. Actually, my preference is for not writing such silly code in the first place, but there you go.