Hello together,

This days I moved Try::Chain from our project to CPAN. The problem was, fetching database results, sometimes mapped in hashes or arrays. Then long chains is the result and this chains can break 1 or more times.
Is
    pragma 'soft_call';
already working?

Regards Steffen.


Am 19.04.2017 um 09:56 schrieb KES:
завсегдатаи подсказали: 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] <mailto:[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
    <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] <mailto:[email protected]>
    http://mail.pm.org/mailman/listinfo/kiev-pm
    <http://mail.pm.org/mailman/listinfo/kiev-pm>

,

_______________________________________________
Kiev-pm mailing list
[email protected] <mailto:[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

Ответить