[Kiev-pm] Soft call operator (Оператор мягкого вызова): ~>

Konstantin Cherednichenko dshadowukraine at gmail.com
Wed Apr 19 00:22:10 PDT 2017


Отличная идея! Спасибо!

On Apr 19, 2017 10:19, "KES" <kes-kes at yandex.ru> 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
> Kiev-pm at pm.org
> http://mail.pm.org/mailman/listinfo/kiev-pm
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/kiev-pm/attachments/20170419/2a2f4542/attachment.html>


More information about the Kiev-pm mailing list