[Moscow.pm] AnyEvent::Pg
Ivan Petrov
i.petro.77.00 на gmail.com
Вт Май 1 10:54:48 PDT 2012
>>> Обязательно нужен подход, а то получится лапша. Не
>>> раз о CPS (continuation passing style) говорил, но что-то пока
>>> бесполезно.
>>
>> кто бы фреймворк CPS бы написал чтобы удобный был итп и
>> производительность чтобы не страдала.
> Вот весь фреймворк :)
> sub foo ($$&) {
> my ($one, $two, $cb) = @_;
> ...
> bar 1, sub {
> baz 2, 3, sub {
> &$cb(shift, ...)
> };
> };
> }
а вот это та самая лапша. которая очень плохо отлаживается поскольку
не явно видно что твой &$cb действительно вызывается во всех возможных
комбинациях.
То есть основная проблема (вернее основная ошибка) не решается
средствами языка (фреймворка): забытый так называемый return.
> Тут главное что: это только функции, они не возвращают guard объектов,
> никогда не умирают и результат возвращают только в колбэк.
и вот с guard'ами эти "забытые" return'ы как раз и можно
контроллировать.
то есть если ты объект передашь вместо каллбека функции, который будет
содержать в себе каллбек, а в деструкторе если тот каллбек не был
вызван - вызывать каллбек с ошибкой, вот тогда это начнет превращаться
в фреймворк, но это еще надо универсально написать
> Для обработки ошибок можно устанавливать $! и очищать, когда все ок, а
> в @_ ложить подробности.
ну и с AE тоже можно не использовать guard'ы. я кстати на эту тему в
свое время Марку писал багу: у него не везде в VOID-контексте ватчер
можно поставить, он обещался пофиксить. Если что можно свою обертку
сделать.
я кстати тоже считаю что в событийно ориентированном программировании
ватчеры надо ставить общесистемные. просто иногда его пытаются
соеденить с ООП и получается лажа.
Подробная информация о списке рассылки Moscow-pm