<HTML><BODY><p>Привет! Я тут на япси рассказывал про это, но все спали( <a href="https://www.youtube.com/watch?v=17Lo_QLcid4&feature=youtu.be&t=27395" data-mce-href="https://www.youtube.com/watch?v=17Lo_QLcid4&feature=youtu.be&t=27395">https://www.youtube.com/watch?v=17Lo_QLcid4&feature=youtu.be&t=27395</a>  )</p><p> однако рассказчик из меня так себе, к тому же это был вольный перевод статьи:<br data-mce-bogus="1"></p><p>http://shadow.cat/blog/matt-s-trout/madness-with-methods/<br data-mce-bogus="1"></p><p><br><br><br></p><p><br data-mce-bogus="1"></p><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        Среда, 19 апреля 2017, 11:03 +03:00 от moscow-pm-request@pm.org:<br>
        <br>
        <div id="">






















        












<div class="js-helper js-readmsg-msg">
        <style type="text/css"></style>
        <div>
                <base target="_self" href="https://e.mail.ru/">
                
            <div id="style_14925890180000027235_BODY">Сообщения, предназначенные для списка<br>
рассылки Moscow-pm, отправляйте по адресу<br>
        <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a><br>
<br>
Для изменения параметров подписки или<br>
отписки используйте веб-страницу<br>
        <a href="http://mail.pm.org/mailman/listinfo/moscow-pm" target="_blank">http://mail.pm.org/mailman/listinfo/moscow-pm</a><br>
или отправьте письмо, в теле или теме<br>
которого будет слово 'help', по адресу<br>
        <a href="mailto:moscow-pm-request@pm.org">moscow-pm-request@pm.org</a><br>
<br>
Адрес администратора этого списка<br>
рассылки:<br>
        <a href="mailto:moscow-pm-owner@pm.org">moscow-pm-owner@pm.org</a><br>
<br>
При ответе, пожалуйста, измените тему<br>
письма на более содержательную чем "Re:<br>
Содержание дайджеста списка рассылки<br>
Moscow-pm..."<br>
<br>
<br>
В этом номере:<br>
<br>
   1. Soft call operator (Оператор мягкого<br>
      вызова): ~> (KES)<br>
   2. Re:  Soft call operator (Оператор мягкого<br>
      вызова): ~> (Alexander Q)<br>
   3. Re:  Soft call operator (Оператор мягкого<br>
      вызова): ~> (Alexander Q)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Wed, 19 Apr 2017 10:17:49 +0300<br>
From: KES <<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a>><br>
To: Moscow.pm group <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>><br>
Cc: Kiev. pm group <<a href="mailto:kiev-pm@pm.org">kiev-pm@pm.org</a>><br>
Subject: [Moscow.pm] Soft call operator (Оператор<br>
        мягкого вызова): ~><br>
Message-ID: <<a href="mailto:2654291492586269@web57g.yandex.ru">2654291492586269@web57g.yandex.ru</a>><br>
Content-Type: text/plain; charset=utf-8<br>
<br>
Привет.<br>
<br>
А у меня вот давно витает идея "мягкого вызова". <br>
Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL 0`<br>
<br>
ну вот снова вернулся к этой теме.<br>
<br>
1. Что не так?<br>
Очень часто приходится писать следующий код:<br>
my $x; my $y;<br>
if( ($x =  $obj->method)   &&  $y =  $x->another_method ) {<br>
     $y = ...;<br>
}<br>
<br>
Пример из жизни:<br>
<br>
if( $db->query( ... )->hash->{ value } ) { ... }<br>
if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' ) { ... }<br>
<br>
<br>
тут если запрос вернул пустой результат, то код упадёт.<br>
<br>
А если использовать оператор мягкого вызова, то можно будет не бояться исключений и код станет проще:<br>
<br>
use pragma 'soft_call';<br>
if( my $x =  $obj->method~>another_method ) { ... }<br>
if( $db->query( ... )~>hash->{ value } ) { ... }<br>
if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' ) { ... }<br>
<br>
И вроде как всё выразительно получается.<br>
<br>
Даже сама реализация прагмы в десяток строк:<br>
1. делаем плагин для keyword, Наподобие  Syntax::Keyword::Try <br>
2. цепляемся на <a href="http://perldoc.perl.org/perlguts.html#Pluggable-runops" target="_blank">http://perldoc.perl.org/perlguts.html#Pluggable-runops</a><br>
3. Псевдокод:<br>
sub soft_call_operator {<br>
    my( $left_operand, $right_operand ) =  @_;<br>
<br>
    return undef    if !defined $left_operand;<br>
<br>
    '->'( $left_operand, $right_operand ); # делаем обычную обработку вызова функции<br>
}<br>
<br>
<br>
Комментарии wellcome<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Wed, 19 Apr 2017 07:42:03 +0000<br>
From: Alexander Q <<a href="mailto:qalexx@gmail.com">qalexx@gmail.com</a>><br>
To: "Moscow.pm group" <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>><br>
Cc: KES <<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a>>, "Kiev. pm group" <<a href="mailto:kiev-pm@pm.org">kiev-pm@pm.org</a>><br>
Subject: Re: [Moscow.pm]  Soft call operator (Оператор<br>
        мягкого вызова): ~><br>
Message-ID:<br>
        <<a href="mailto:CAEJuZgeq8BP9uZ+TahvOHzsjXHYb+nyn4ioXORnSNjZ-hQG=pg@mail.gmail.com">CAEJuZgeq8BP9uZ+TahvOHzsjXHYb+nyn4ioXORnSNjZ-hQG=pg@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Это монада<br>
<br>
On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>> wrote:<br>
<br>
> Привет.<br>
><br>
> А у меня вот давно витает идея "мягкого вызова".<br>
> Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL<br>
> 0`<br>
><br>
> ну вот снова вернулся к этой теме.<br>
><br>
> 1. Что не так?<br>
> Очень часто приходится писать следующий код:<br>
> my $x; my $y;<br>
> if( ($x =  $obj->method)   &&  $y =  $x->another_method ) {<br>
>      $y = ...;<br>
> }<br>
><br>
> Пример из жизни:<br>
><br>
> if( $db->query( ... )->hash->{ value } ) { ... }<br>
> if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2'<br>
> ) { ... }<br>
><br>
><br>
> тут если запрос вернул пустой результат, то код упадёт.<br>
><br>
> А если использовать оператор мягкого вызова, то можно будет не бояться<br>
> исключений и код станет проще:<br>
><br>
> use pragma 'soft_call';<br>
> if( my $x =  $obj->method~>another_method ) { ... }<br>
> if( $db->query( ... )~>hash->{ value } ) { ... }<br>
> if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2'<br>
> ) { ... }<br>
><br>
> И вроде как всё выразительно получается.<br>
><br>
> Даже сама реализация прагмы в десяток строк:<br>
> 1. делаем плагин для keyword, Наподобие  Syntax::Keyword::Try<br>
> 2. цепляемся на <a href="http://perldoc.perl.org/perlguts.html#Pluggable-runops" target="_blank">http://perldoc.perl.org/perlguts.html#Pluggable-runops</a><br>
> 3. Псевдокод:<br>
> sub soft_call_operator {<br>
>     my( $left_operand, $right_operand ) =  @_;<br>
><br>
>     return undef    if !defined $left_operand;<br>
><br>
>     '->'( $left_operand, $right_operand ); # делаем обычную обработку<br>
> вызова функции<br>
> }<br>
><br>
><br>
> Комментарии wellcome<br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
----------- следущая часть -----------<br>
Вложение в формате HTML было извлечено&hellip;<br>
URL: <<a href="http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/c7accc8c/attachment-0001.html" target="_blank">http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/c7accc8c/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Wed, 19 Apr 2017 07:56:39 +0000<br>
From: Alexander Q <<a href="mailto:qalexx@gmail.com">qalexx@gmail.com</a>><br>
To: "Moscow.pm group" <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>><br>
Cc: KES <<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a>>, "Kiev. pm group" <<a href="mailto:kiev-pm@pm.org">kiev-pm@pm.org</a>><br>
Subject: Re: [Moscow.pm]  Soft call operator (Оператор<br>
        мягкого вызова): ~><br>
Message-ID:<br>
        <<a href="mailto:CAEJuZgcwfhDer0z52x74-CdNvPOX2L1FjJJCWWSbkot-cA6CBQ@mail.gmail.com">CAEJuZgcwfhDer0z52x74-CdNvPOX2L1FjJJCWWSbkot-cA6CBQ@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Чтоб быть точным, монада Maybe в терминах хаскеля.<br>
<br>
из пары функций типов f :: a -> Maybe b, g :: b -> Maybe c вы составляете<br>
функцию a -> Maybe c оператором bind ("мягкого вызова" в ваших терминах)<br>
следующим образом:<br>
<br>
(f a) >>= g<br>
<br>
или можете сделать функцию новую просто с новым типом<br>
u :: a -> Maybe c<br>
u = f >> g<br>
<br>
и применять её<br>
u a<br>
<br>
Вообще, монады не просто так возникли. Это хорошая, мощная абстракция,<br>
которая работает не только для "мягких вызовов". Нет ничего плохого в<br>
придумывании велосипедов, но прежде чем запускать их массовое производство,<br>
имеет смысл изучить опыт конкурентов.<br>
<br>
<br>
<br>
On Wed, Apr 19, 2017 at 10:42 AM Alexander Q <<a href="mailto:qalexx@gmail.com">qalexx@gmail.com</a>> wrote:<br>
<br>
> Это монада<br>
><br>
> On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>> wrote:<br>
><br>
>> Привет.<br>
>><br>
>> А у меня вот давно витает идея "мягкого вызова".<br>
>> Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL<br>
>> 0`<br>
>><br>
>> ну вот снова вернулся к этой теме.<br>
>><br>
>> 1. Что не так?<br>
>> Очень часто приходится писать следующий код:<br>
>> my $x; my $y;<br>
>> if( ($x =  $obj->method)   &&  $y =  $x->another_method ) {<br>
>>      $y = ...;<br>
>> }<br>
>><br>
>> Пример из жизни:<br>
>><br>
>> if( $db->query( ... )->hash->{ value } ) { ... }<br>
>> if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2'<br>
>> ) { ... }<br>
>><br>
>><br>
>> тут если запрос вернул пустой результат, то код упадёт.<br>
>><br>
>> А если использовать оператор мягкого вызова, то можно будет не бояться<br>
>> исключений и код станет проще:<br>
>><br>
>> use pragma 'soft_call';<br>
>> if( my $x =  $obj->method~>another_method ) { ... }<br>
>> if( $db->query( ... )~>hash->{ value } ) { ... }<br>
>> if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2'<br>
>> ) { ... }<br>
>><br>
>> И вроде как всё выразительно получается.<br>
>><br>
>> Даже сама реализация прагмы в десяток строк:<br>
>> 1. делаем плагин для keyword, Наподобие  Syntax::Keyword::Try<br>
>> 2. цепляемся на <a href="http://perldoc.perl.org/perlguts.html#Pluggable-runops" target="_blank">http://perldoc.perl.org/perlguts.html#Pluggable-runops</a><br>
>> 3. Псевдокод:<br>
>> sub soft_call_operator {<br>
>>     my( $left_operand, $right_operand ) =  @_;<br>
>><br>
>>     return undef    if !defined $left_operand;<br>
>><br>
>>     '->'( $left_operand, $right_operand ); # делаем обычную обработку<br>
>> вызова функции<br>
>> }<br>
>><br>
>><br>
>> Комментарии wellcome<br>
>> --<br>
>> Moscow.pm mailing list<br>
>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
>><br>
><br>
----------- следущая часть -----------<br>
Вложение в формате HTML было извлечено&hellip;<br>
URL: <<a href="http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/fe63f691/attachment.html" target="_blank">http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/fe63f691/attachment.html</a>><br>
<br>
------------------------------<br>
<br>
Subject: Нижний колонтитул дайджеста<br>
<br>
_______________________________________________<br>
Moscow-pm mailing list<br>
<a href="mailto:Moscow-pm@pm.org">Moscow-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/moscow-pm" target="_blank">http://mail.pm.org/mailman/listinfo/moscow-pm</a><br>
<br>
<br>
------------------------------<br>
<br>
Конец Дайджест списка рассылки Moscow-pm; том 114, выпуск 3<br>
***********************************************************************************************<br>
</div>
            
        
                <base target="_self" href="https://e.mail.ru/">
        </div>

        
</div>


</div>
</blockquote>
<br>
<br>С уважением,<br>Андрей Еньшин<br></BODY></HTML>