Stefan Lidman writes:
> So, I must ask, what does this do:
> 
> >    sub foo() {
> >        return my $self = {
> >            print "Block";
> >            return $self;
> >        }
> >    }
>     
> >    my $block = foo;
> #              = sub {print "Block"; return $self;}
> 
> A6:
> One obvious difference is that the sub on closures is now optional,
> since every brace-delimited block is now essentially a closure. You
> can still put the sub if you like. But it is only required if the
> block would otherwise be construed as a hash value; that is, if it
> appears to contain a list of pairs.

Um, yeah, but just a little farther down:

    Although we say the sub keyword is now optional on a closure, the
    return keyword only works with an explicit sub. (There are other
    ways to return values from a block.)

And to clarify:

    sub indexof(Selector $which, [EMAIL PROTECTED]) {
        for zip(@data, 0...) -> $_, $index {
            when $which { return $index }
        }
    }

Which actually creates a closure (well, in theory at least) on line 2
for the for loop, but the return inside of it returns from indexof.
Which is actually very, very nice.

So the question is: What happens when indexof isn't on the call chain,
but that inner closure is?

Luke

> >    print "Main";
> >    $block();
> >    print "End";
> 
> >That is, the block returns from a function that's not currently
> >executing.
> 
> Main
> Block
> End
> 
> is my guess.
> 
> /Stefan

Reply via email to