завсегдатаи подсказали: http://www.perlmonks.org/?node_id=973015


19.04.2017, 10:23, "Konstantin Cherednichenko" <[email protected]>:
Отличная идея! Спасибо!

On Apr 19, 2017 10:19, "KES" <[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
_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm
,

_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

Ответить