Теоретически это как раз то что нужно, а практически проблема в убогости перлового source filtering, который Combinator использует. При нормальных макросах вложенность такого рода разруливалась бы намного проще.
/dk On Fri, Feb 03, 2012 at 11:39:51PM +0400, Андрей П. Ковбович wrote: > Вы не это искали? > > Вот пример из модуля https://metacpan.org/module/Combinator > > When you are tired of writing layered closures > > use AnyEvent::DBI; > ... > $dbh->exec("select ...", sub { > ... > $dbh->exec("select ...", sub { > ... > $dbh->exec("select ...", sub { > ... > $dbh->exec("select ...", sub { > ... > }); > }); > }); > }); > > You can achieve that like this: > > use Combinator; > use AnyEvent::DBI; > ... > {{com > $dbh->exec("select ...", {{next}}); > ... > --ser > $dbh->exec("select ...", {{next}}); > ... > --ser > $dbh->exec("select ...", {{next}}); > ... > --ser > $dbh->exec("select ...", {{next}}); > ... > }}com > > 27 января 2012 г. 10:05 пользователь Dmitry Karasik > <[email protected]> написал: > > On Fri, Jan 27, 2012 at 12:46:42AM +0200, Alexandr Gomoliako wrote: > >> > Этого я не понимаю. Как AE решает проблему с большим количеством > >> > коллбэков > >> > и их ожиданиями, синхронизацией между собой, и поочередным (т.е. не > >> > параллельным) исполнением? > >> > >> AE никак не решает, он здесь просто для примера. > > > > Ну так и я о том же - а лямбда решает. К чему собственно я и веду - у них > > разные подходы, и разные решения, похожие только в том что и там и там > > коллбэки. > > > >> Если нужно много подождать, можно просто сделать счетчик. Но в целом > >> все очень просто и даже внешне похоже на лямбду: > > > > Да я как бы и не спорю что нельзя ;) > > > >> > >> sub request { > >> my ($host, $port, $buf, $cb) = @_; > >> my ($fh, $w, $t, $callback); > >> > >> $callback = sub { > >> &$cb; > >> undef $t; > >> undef $w; > >> }; > >> > >> tcp_connect $host, $port, sub { > >> ($fh) = @_; > >> > >> # writable > >> $t = AE::timer 5, 0, $callback; > >> $w = AE::io $fh, 1, sub { > >> > >> my $len = syswrite $fh, $buf, ...; > >> > >> # readable > >> $t = AE::timer 5, 0, $callback; > >> $w = AE::io $fh, 0, sub { > >> > >> my $len = sysread $fh, $buf, ...; > >> > >> &$callback($buf); > >> }; > >> }; > >> }; > >> } > >> > >> sub do_some { > >> my ($arg, $cb) = @_; > >> > >> request '1.2.3.4', 123, "foo, $arg", sub { > >> my ($foo) = @_; > >> > >> request '2.3.4.5', 123, "bar, $foo", sub { > >> my ($bar) = @_; > >> > >> &$cb($foo, $bar); > >> }; > >> }; > >> } > >> > >> sub do_many { > >> my ($arg, $cb) = @_; > >> my (@res, $cnt); > >> > >> my $gather = sub { > >> push @res, \@_; > >> &$cb(@res) if --$cnt == 0; > >> }; > >> > >> $cnt++; > >> request '1.2.3.4', 123, "foo, $arg", $gather; > >> > >> $cnt++; > >> request '1.2.3.4', 123, "foo, $arg", $gather; > >> > >> $cnt++; > >> request '1.2.3.4', 123, "foo, $arg", $gather; > >> } > >> > >> > >> do_some "foobar", sub { > >> print "got @_\n"; > >> > >> do_many "baz", sub { > >> print "got many @_\n"; > >> }; > >> }; > >> -- > >> Moscow.pm mailing list > >> [email protected] | http://moscow.pm.org > > > > -- > > Sincerely, > > Dmitry Karasik > > > > -- > > Moscow.pm mailing list > > [email protected] | http://moscow.pm.org > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Sincerely, Dmitry Karasik -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
