On Wed, Jan 25, 2012 at 10:29:17PM +0200, Alexandr Gomoliako wrote:
> On Wed, Jan 25, 2012 at 12:18 AM, Mons Anderson <[email protected]> wrote:
> > Если уж и приводить в пример альтернативный синтаксис, то не CPS, а
> > IO::Lambda
> 
> Ну это тот же подход. Только можно не изобретать ничего, а просто
> использовать функции и колбэки.

Ну попрошу все же различать - IO::Lambda это гораздо больше чем просто коллбеки 
-
в частности, это возможность последовательность этих коллбэков всячески 
оборачивать,
комбинировать, отменять, ждать выполнения их всех а не просто выстрелить кучу, 
и многая,
и многая другая. А AnyEvent может быть использован как бакэнд, так что скорость 
та же.

За читабельность, ну да, это субъективно .. tcp_server'а там нет, но если б 
был, 
то аналогичный код вызывался бы где-то так:

sub handle_connection
{
        my $socket = shift;
        lambda {
                context $socket, $timeout;
        readable {
                return 'timeout' unless shift;
                sysread $socket, ...
        writable {
                return 'timeout' unless shift;
                syswrite $socket, ...
        }}}
}

lambda {
        context port => 55555, timeout => $timeout;
tcp_server {
        context handle_connection(@_);
        tail {};
        again;
}}

т.е. сервер отдельно, обработчик отдельно, и код обработчика линейный а не 
разбросанный.

/dk

> 
> Как-то так можно для AE, читабельно и не очень сложно
> (как бонус у такого кода достаточно хорошая производительность) :
> 
> tcp_server undef, 55555, sub {
>     my ($fh, $host, $port) = @_;
>     my ($start, $read_timeout, $read, $end);
>     my ($t, $w, $buf);
> 
>     $start = sub {
>         $t = AE::timer 15, 0, $read_timeout;
>         $w = AE::io $fh, 0, $read;
>     };
> 
>     $read_timeout = sub {
>         ...
>         &$end();
>     };
> 
>     $read = sub {
>         my $len = sysread $fh, $buf, ...;
> 
>         if ($len) {
>             $t = AE::timer 15, 1, $write_timeout;
>             $w = AE::io $fh, 0, $write;
>             &$write();
>             ...
>         } elsif (...) {
>             ...
>             &$end();
>         }
>     }
>     ...
> 
>     $end = sub {
>         undef $w;
>         undef $t;
>         ...
>     };
> 
>     &$start();
> };
> -- 
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org

-- 
Sincerely,
        Dmitry Karasik

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить