note
runrig
<p>Update: Didn't realize that Ruby's 'yield' did not involve 'real' coroutines. The OP has since been updated.</p>
<p>Here's my take on accomplishing "sort of" the same thing in a couple of different ways (w/regard to argument passing) w/[cpan://Coro]. I know it's not the same thing, but worth comparing and contrasting and thinking about:</p><code>
use Coro::State;
use Coro::Channel;
{
my $new;
my $test = sub {
my ($m, $f) = @_;
print "In method\n";
$f->(1);
$new->transfer($m);
print "In method again\n";
$f->(2);
$new->cancel();
$new->transfer($m);
};
my $main = Coro::State->new();
my $f = sub { print "In block: $_[0]\n" };
$new = Coro::State->new($test, $main, $f);
while ( !$new->is_zombie() ) {
$main->transfer($new);
}
print "Done!\n";
}
{
my $new;
my $test = sub {
my ($m, $q) = @_;
print "In method\n";
$q->put(1);
$new->transfer($m);
print "In method again\n";
$q->put(2);
$new->cancel();
$new->transfer($m);
};
my $main = Coro::State->new();
my $ch = Coro::Channel->new();
$new = Coro::State->new($test, $main, $ch);
while ( !$new->is_zombie() ) {
$main->transfer($new);
my $got = $ch->get();
print "Inblock: $got\n";
}
print "Done!\n";
</code>
1029925
1029925