On Thu, Oct 02, 2003 at 11:39:20AM +0100, Dave Mitchell wrote: > On Thu, Oct 02, 2003 at 04:15:06AM -0600, Luke Palmer wrote: > > So the question is: What happens when indexof isn't on the call chain, > > but that inner closure is? > > But how can the inner closure be called if not via indexof?
I believe that's exactly what Luke's original example was illustrating. On Thu, Oct 02, 2003 at 01:59:26AM -0600, Luke Palmer wrote: > So, I must ask, what does this do: > > sub foo() { > return my $self = { > print "Block"; > return $self; > } > } foo() returns a closure that contains code that returns from the foo() subroutine (the line that says "return $self") When that closure is then called ... > my $block = foo; > print "Main"; > $block(); ... foo() is no longer executing. > That is, the block returns from a function that's not currently > executing. > > Will the output be: a) > > Can't 'return' from closure Block > > b) > > Main > Block > Can't 'return' from closure Block > > (just like (a) but runtime) > c) > > Main > Block > > (the block's return returns from the main program, or whatever function > is currently executing) > > d) > > Main > Block > Main > Block > Main > Block > ... > > (the block closes over the function's return continuation) I would expect (a) to happen, but (d) has some interesting possibilities. And wouldn't (d) be: Main Block Block Block ... ? Actually, if your last parenthetical were true, it would be Main Block End because though foo()'s return continuation is closed over, it only gets executed once and then returned. I.e., to get "Block" again, you'd need to execute the return value of $block. my $block = foo; print "Main"; $b2 = $block(); $b3 = $b2(); $b4 = $b3(); # etc. print "End"; or for the infinite version: my $block = foo; print "Main"; $block = $block() while 1; print "End"; # we never get here Or am I missing something? -Scott -- Jonathan Scott Duff [EMAIL PROTECTED]