<p dir="ltr">Это монада</p>
<br><div class="gmail_quote"><div dir="ltr">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></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Привет.<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" rel="noreferrer" 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>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</blockquote></div>