Re: return() in pointy blocks
by Piers Cawley other posts by this author
Jun 8 2005 7:07AM messages near this date
Re: Musing on registerable event handlers for some specific events
|
Re: return() in pointy blocks
Piers Cawley <pdcawley@[...].uk> writes:
> "TSa (Thomas Sandlaß)" <Thomas.Sandlass@[...].com> writes:
>
> > Piers Cawley wrote:
> >> My preference is for:
> >> Boo
> >> Boo
> >> Can't dereferene literal numeric literal 42 as a coderef.
> >
> > How do you reach the second 'Boo'? Iff -> does not create a Sub
> > but a Block instance then Luke's code can be interpreted as a
> > much smarter version of
>
> I really wish you'd quote in more detail, it makes it a real PITA to go back
> and find the explanatory code.
>
> sub foo () {
> return -> { return 42 }
> }
>
> my $code = foo();
> # ^--- continuations points to the RHS of the assignment
> say "Boo!";
> $code();
>
> So, this is what happens.
>
> 1. foo() returns a coderef to the RHS of the assignment.
> 2. The coderef gets assigned to $code.
> 3. say "Boo!"
> 4. We invoke the coderef, which returns 14 to continuation which was current
> when it was created.
> 5. That means 42 gets returned to the RHS of the assignment
> 6. say "Boo!"
> 7. Try to invoke the literal 42.
> 8. Die.
>
> In other words, it outputs:
>
> Foo
> Foo
> # dies
If that works, then I think it means we can write:
sub call-with-current-continuation(Code $code) {
my $cc = -> $retval { return $retval }
$code($cc);
}
Which I personally think is rather cute. Even if I can't quite bring myself to
believe it's that simple...
Thread:
Piers Cawley
Luke Palmer
Larry Wall
=22TSa_=28Thomas_Sandla=DF=29=22
|