[Kiev-pm] Soft call operator (Оператор мягкого вызова): ~>
Steffen Winkler
steffen at steffen-winkler.de
Wed Apr 19 01:20:02 PDT 2017
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" <dshadowukraine at gmail.com>:
>> Отличная идея! Спасибо!
>>
>> On Apr 19, 2017 10:19, "KES" <kes-kes at yandex.ru
>> <mailto: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
>> <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 <mailto:Kiev-pm at pm.org>
>> http://mail.pm.org/mailman/listinfo/kiev-pm
>> <http://mail.pm.org/mailman/listinfo/kiev-pm>
>>
>> ,
>>
>> _______________________________________________
>> Kiev-pm mailing list
>> Kiev-pm at pm.org <mailto:Kiev-pm at pm.org>
>> http://mail.pm.org/mailman/listinfo/kiev-pm
>>
>
>
> _______________________________________________
> 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/23b6a74b/attachment.html>
More information about the Kiev-pm
mailing list