Пожалуйста, не добавляйте неработающие расширения синтаксиса в свою программу, чтобы решить решенную проблему. Вам нужны замыкания и метод, иногда называемый каррингом.
Каррирование — это работа по преобразованию функции, которая принимает несколько аргументов, в функцию, которая вызывается несколько раз с одним аргументом каждая. Например, рассмотрим
sub subtract {
my ($x, $y) = @_;
return $x - $y;
}
Теперь мы можем создать подпрограмму, которая уже предоставляет первый аргумент:
sub subtract1 { subtract(40, @_) }
Вызов subtract1(20)
теперь оценивается как 20
.
Вместо этого мы можем использовать анонимные подпрограммы, что делает это более гибким:
my $subtract = sub { subtract(40, @_) };
$subtract->(20);
Нам не нужна эта переменная:
sub { subtract(40, @_) }->(20); # equivalent to subtract(40, 20)
Мы можем написать subtract
так, чтобы сделать это напрямую:
sub subtract_curried {
my $x = shift;
# don't return the result, but a subroutine that calculates the result
return sub {
my $y = shift;
return $x - $y;
};
}
Теперь: subtract_curried(40)->(20)
— обратите внимание на стрелку между ними, так как мы имеем дело с ссылкой на код (другое название анонимной подпрограммы или замыкания).
Этот стиль написания функций гораздо более распространен в функциональных языках, таких как Haskell или OCaml, где синтаксис для этого красивее. Это позволяет очень гибко комбинировать функции. Если вас интересует такое программирование на Perl, вы можете прочитать Perl высшего порядка эм>а>.
person
amon
schedule
18.12.2013
subtract(40)->(20)
будет допустимым синтаксисом. Еслиsubtract
возвращает замыкание, это даже сработает.(40)(20)
не будет действительным, если вы не совершили серьезное насилие над синтаксическим анализатором. И ни один из вариантов не является более читаемым оператором вычитания, чем старый добрый инфикс-
, который мы все знаем примерно с детского сада. Есть смысл? - person   schedule 19.12.2013