Another favorite higher order function of mine is right curry:
sub rcurry {
my ($f, @args) = @_;
return sub { $f->(@_, @args) };
}
*company_name = &rcurry(\&wrap_with_html, "FoxTrotUniform Inc.");
print company_name('B');
print company_name('I');
print company_name('H1');
And these are nice function builders from
Dylan.
sub conjoin {
my ($f, $f2) = @_;
return sub { $f->(@_) && $f2->(@_) }
}
sub disjoin {
my ($f, $f2) = @_;
return sub { $f->(@_) || $f2->(@_) }
}
*company_name_better = disjoin(
conjoin(
sub { return 1 if scalar @_ == 0 },
curry(\&company_name, 'H1')
),
\&company_name
);
print company_name_better('B');
print company_name_better();
And of course, if you really want to make your head spin, there is always
combinators.