думаю это похоже на операторы с условием NULL в C#
https://msdn.microsoft.com/ru-ru/library/dn986595.aspx
https://msdn.microsoft.com/ru-ru/library/dn986595.aspx
19.04.2017, 09:03, "Alexander Q via Moscow-pm" <[email protected]>:
Чтоб быть точным, монада Maybe в терминах хаскеля.из пары функций типов f :: a -> Maybe b, g :: b -> Maybe c вы составляете функцию a -> Maybe c оператором bind ("мягкого вызова" в ваших терминах) следующим образом:(f a) >>= gили можете сделать функцию новую просто с новым типомu :: a -> Maybe cu = f >> gи применять еёu aВообще, монады не просто так возникли. Это хорошая, мощная абстракция, которая работает не только для "мягких вызовов". Нет ничего плохого в придумывании велосипедов, но прежде чем запускать их массовое производство, имеет смысл изучить опыт конкурентов.,--On Wed, Apr 19, 2017 at 10:42 AM Alexander Q <[email protected]> wrote:Это монада
On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <[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
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
--
Яндекс.Почта — надёжная почта
Яндекс.Почта — надёжная почта
http://mail.yandex.ru/neo2/collect/?exp=1&t=1
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
