Беше споменато, че Javascript поддържа определени функции от по-висок порядък, включително есе от Джоел Сполски. Марк Джейсън Доминус написа цяла книга, наречена Higher–Order Perl; източникът на книгата е достъпен за безплатно изтегляне в различни фини формати, включително PDF.
Поне от Perl 3 насам, Perl поддържа функционалност, напомняща повече на Lisp, отколкото на C, но едва в Perl 5 беше налична пълна поддръжка за затваряния и всичко, което следва от това. И нито едно от първите имплементации на Perl 6 не е написано на Haskell, което е оказало голямо влияние върху развитието на дизайна на този език.
Примери за подходи за функционално програмиране в Perl се появяват в ежедневното програмиране, особено с map
и grep
:
@ARGV = map { /\.gz$/ ? "gzip -dc < $_ |" : $_ } @ARGV;
@unempty = grep { defined && length } @many;
Тъй като sort
също допуска затваряне, моделът map/sort/map
е супер често срещан:
@txtfiles = map { $_->[1] }
sort {
$b->[0] <=> $a->[0]
||
lc $a->[1] cmp lc $b->[1]
||
$b->[1] cmp $a->[1]
}
map { -s => $_ }
grep { -f && -T }
glob("/etc/*");
or
@sorted_lines = map { $_->[0] }
sort {
$a->[4] <=> $b->[4]
||
$a->[-1] cmp $b->[-1]
||
$a->[3] <=> $b->[3]
||
...
}
map { [$_ => reverse split /:/] } @lines;
Функцията reduce
прави хакерството на списъци лесно без зацикляне:
$sum = reduce { $a + $b } @numbers;
$max = reduce { $a > $b ? $a : $b } $MININT, @numbers;
Има много повече от това, но това е само вкус. Затварянията улесняват създаването на генератори на функции, писане на ваши собствени функции от по-висок ред, а не само използване на вградените. Всъщност един от най-често срещаните модели на изключение,
try {
something();
} catch {
oh_drat();
};
е не вградена. Това обаче е почти тривиално дефинирано, като try
е функция, която приема два аргумента: затваряне в първия аргумент и функция, която приема затваряне във втория.
Perl 5 няма вградено currying, въпреки че има модул за това. Perl 6 обаче има къри и първокласни продължения, вградени направо в него, плюс много повече.
person
tchrist
schedule
27.04.2011