Привет! Я тут на япси рассказывал про это, но все спали( https://www.youtube.com/watch?v=17Lo_QLcid4&feature=youtu.be&t=27395 ) однако рассказчик из меня так себе, к тому же это был вольный перевод статьи: http://shadow.cat/blog/matt-s-trout/madness-with-methods/
>Среда, 19 апреля 2017, 11:03 +03:00 от [email protected]: > >Сообщения, предназначенные для списка >рассылки Moscow-pm, отправляйте по адресу >[email protected] > >Для изменения параметров подписки или >отписки используйте веб-страницу >http://mail.pm.org/mailman/listinfo/moscow-pm >или отправьте письмо, в теле или теме >которого будет слово 'help', по адресу >[email protected] > >Адрес администратора этого списка >рассылки: >[email protected] > >При ответе, пожалуйста, измените тему >письма на более содержательную чем "Re: >Содержание дайджеста списка рассылки >Moscow-pm..." > > >В этом номере: > > 1. Soft call operator (Оператор мягкого > вызова): ~> (KES) > 2. Re: Soft call operator (Оператор мягкого > вызова): ~> (Alexander Q) > 3. Re: Soft call operator (Оператор мягкого > вызова): ~> (Alexander Q) > > >---------------------------------------------------------------------- > >Message: 1 >Date: Wed, 19 Apr 2017 10:17:49 +0300 >From: KES < [email protected] > >To: Moscow.pm group < [email protected] > >Cc: Kiev. pm group < [email protected] > >Subject: [Moscow.pm] Soft call operator (Оператор >мягкого вызова): ~> >Message-ID: < [email protected] > >Content-Type: text/plain; charset=utf-8 > >Привет. > >А у меня вот давно витает идея "мягкого вызова". >Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL 0` > >ну вот снова вернулся к этой теме. > >1. Что не так? >Очень часто приходится писать следующий код: >my $x; my $y; >if( ($x = $obj->method) && $y = $x->another_method ) { > $y = ...; >} > >Пример из жизни: > >if( $db->query( ... )->hash->{ value } ) { ... } >if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' ) { >... } > > >тут если запрос вернул пустой результат, то код упадёт. > >А если использовать оператор мягкого вызова, то можно будет не бояться >исключений и код станет проще: > >use pragma 'soft_call'; >if( my $x = $obj->method~>another_method ) { ... } >if( $db->query( ... )~>hash->{ value } ) { ... } >if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' ) { >... } > >И вроде как всё выразительно получается. > >Даже сама реализация прагмы в десяток строк: >1. делаем плагин для keyword, Наподобие Syntax::Keyword::Try >2. цепляемся на http://perldoc.perl.org/perlguts.html#Pluggable-runops >3. Псевдокод: >sub soft_call_operator { > my( $left_operand, $right_operand ) = @_; > > return undef if !defined $left_operand; > > '->'( $left_operand, $right_operand ); # делаем обычную обработку вызова >функции >} > > >Комментарии wellcome > > >------------------------------ > >Message: 2 >Date: Wed, 19 Apr 2017 07:42:03 +0000 >From: Alexander Q < [email protected] > >To: "Moscow.pm group" < [email protected] > >Cc: KES < [email protected] >, "Kiev. pm group" < [email protected] > >Subject: Re: [Moscow.pm] Soft call operator (Оператор >мягкого вызова): ~> >Message-ID: >< CAEJuZgeq8BP9uZ+TahvOHzsjXHYb+nyn4ioXORnSNjZ-hQG=p...@mail.gmail.com > >Content-Type: text/plain; charset="utf-8" > >Это монада > >On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, < [email protected] > wrote: > >> Привет. >> >> А у меня вот давно витает идея "мягкого вызова". >> Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL >> 0` >> >> ну вот снова вернулся к этой теме. >> >> 1. Что не так? >> Очень часто приходится писать следующий код: >> my $x; my $y; >> if( ($x = $obj->method) && $y = $x->another_method ) { >> $y = ...; >> } >> >> Пример из жизни: >> >> if( $db->query( ... )->hash->{ value } ) { ... } >> if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' >> ) { ... } >> >> >> тут если запрос вернул пустой результат, то код упадёт. >> >> А если использовать оператор мягкого вызова, то можно будет не бояться >> исключений и код станет проще: >> >> use pragma 'soft_call'; >> if( my $x = $obj->method~>another_method ) { ... } >> if( $db->query( ... )~>hash->{ value } ) { ... } >> if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' >> ) { ... } >> >> И вроде как всё выразительно получается. >> >> Даже сама реализация прагмы в десяток строк: >> 1. делаем плагин для keyword, Наподобие Syntax::Keyword::Try >> 2. цепляемся на http://perldoc.perl.org/perlguts.html#Pluggable-runops >> 3. Псевдокод: >> sub soft_call_operator { >> my( $left_operand, $right_operand ) = @_; >> >> return undef if !defined $left_operand; >> >> '->'( $left_operand, $right_operand ); # делаем обычную обработку >> вызова функции >> } >> >> >> Комментарии wellcome >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org >> >----------- следущая часть ----------- >Вложение в формате HTML было извлечено… >URL: < >http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/c7accc8c/attachment-0001.html > > > >------------------------------ > >Message: 3 >Date: Wed, 19 Apr 2017 07:56:39 +0000 >From: Alexander Q < [email protected] > >To: "Moscow.pm group" < [email protected] > >Cc: KES < [email protected] >, "Kiev. pm group" < [email protected] > >Subject: Re: [Moscow.pm] Soft call operator (Оператор >мягкого вызова): ~> >Message-ID: >< caejuzgcwfhder0z52x74-cdnvpox2l1fjjjcwwsbkot-ca6...@mail.gmail.com > >Content-Type: text/plain; charset="utf-8" > >Чтоб быть точным, монада Maybe в терминах хаскеля. > >из пары функций типов f :: a -> Maybe b, g :: b -> Maybe c вы составляете >функцию a -> Maybe c оператором bind ("мягкого вызова" в ваших терминах) >следующим образом: > >(f a) >>= g > >или можете сделать функцию новую просто с новым типом >u :: a -> Maybe c >u = f >> g > >и применять её >u a > >Вообще, монады не просто так возникли. Это хорошая, мощная абстракция, >которая работает не только для "мягких вызовов". Нет ничего плохого в >придумывании велосипедов, но прежде чем запускать их массовое производство, >имеет смысл изучить опыт конкурентов. > > > >On Wed, Apr 19, 2017 at 10:42 AM Alexander Q < [email protected] > wrote: > >> Это монада >> >> On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, < [email protected] > wrote: >> >>> Привет. >>> >>> А у меня вот давно витает идея "мягкого вызова". >>> Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL >>> 0` >>> >>> ну вот снова вернулся к этой теме. >>> >>> 1. Что не так? >>> Очень часто приходится писать следующий код: >>> my $x; my $y; >>> if( ($x = $obj->method) && $y = $x->another_method ) { >>> $y = ...; >>> } >>> >>> Пример из жизни: >>> >>> if( $db->query( ... )->hash->{ value } ) { ... } >>> if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' >>> ) { ... } >>> >>> >>> тут если запрос вернул пустой результат, то код упадёт. >>> >>> А если использовать оператор мягкого вызова, то можно будет не бояться >>> исключений и код станет проще: >>> >>> use pragma 'soft_call'; >>> if( my $x = $obj->method~>another_method ) { ... } >>> if( $db->query( ... )~>hash->{ value } ) { ... } >>> if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' >>> ) { ... } >>> >>> И вроде как всё выразительно получается. >>> >>> Даже сама реализация прагмы в десяток строк: >>> 1. делаем плагин для keyword, Наподобие Syntax::Keyword::Try >>> 2. цепляемся на http://perldoc.perl.org/perlguts.html#Pluggable-runops >>> 3. Псевдокод: >>> sub soft_call_operator { >>> my( $left_operand, $right_operand ) = @_; >>> >>> return undef if !defined $left_operand; >>> >>> '->'( $left_operand, $right_operand ); # делаем обычную обработку >>> вызова функции >>> } >>> >>> >>> Комментарии wellcome >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >>> >> >----------- следущая часть ----------- >Вложение в формате HTML было извлечено… >URL: < >http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/fe63f691/attachment.html > > > >------------------------------ > >Subject: Нижний колонтитул дайджеста > >_______________________________________________ >Moscow-pm mailing list >[email protected] >http://mail.pm.org/mailman/listinfo/moscow-pm > > >------------------------------ > >Конец Дайджест списка рассылки Moscow-pm; том 114, выпуск 3 >*********************************************************************************************** С уважением, Андрей Еньшин
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
