Привет. А у меня вот давно витает идея "мягкого вызова". Даже ещё когда писал на ассемблере всегда раздражали исключения при `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 -- Moscow.pm mailing list moscow-pm@pm.org | http://moscow.pm.org