sub printN($) { my $format = shift; sub { sprintf $format, @_ } }
my %functions = (
-power => sub { exp( $_[0] )},
-log2 => sub { log( $_[0] )/log(2.0) },
-loge => sub { log( $_[0] ) },
-log10 => sub { log( $_[0] )/log(10.0) },
-round => sub { int($_[0] + ($_[0] <=> 0)*0.5) },
-trunc => sub { int $_[0] },
-f1 => printN "%.1f",
-f2 => printN "%.2f",
-f3 => printN "%.3f",
-f4 => printN "%.4f",
-f5 => printN "%.5f",
);
####
my @func_pipeline = grep {$_} map {$functions{"$_"}} @ARGV;
@ARGV = grep {!$functions{"$_"}} @ARGV;
####
sub compose($$) { my ($f, $g) = @_; sub { $f->( $g->(@_) ) } }
sub id { @_ }; # identity function
my $composite_fn = reduce {compose($a,$b)} @func_pipeline, \&id;
####
print join ' ', map $composite_fn->($_), split while <>;
####
#!/usr/bin/perl -l
use strict;
use List::Util qw( reduce );
sub printN($) { my $format = shift; sub { sprintf $format, @_ } }
sub compose($$) { my ($f, $g) = @_; sub { $f->( $g->(@_) ) } }
sub id { @_ }; # identity function
my %functions = (
-power => sub { exp( $_[0] )},
-log2 => sub { log( $_[0] )/log(2.0) },
-loge => sub { log( $_[0] ) },
-log10 => sub { log( $_[0] )/log(10.0) },
-round => sub { int($_[0] + ($_[0] <=> 0)*0.5) },
-trunc => sub { int $_[0] },
-f1 => printN "%.1f",
-f2 => printN "%.2f",
-f3 => printN "%.3f",
-f4 => printN "%.4f",
-f5 => printN "%.5f",
);
my @func_pipeline = grep {$_} map {$functions{"$_"}} @ARGV;
@ARGV = grep {!$functions{"$_"}} @ARGV;
my $composite_fn = reduce {compose($a,$b)} @func_pipeline, \&id;
print join ' ', map $composite_fn->($_), split while <>;
####
$ echo 1 2 3 | ./calc-pipeline -f4 -power
2.7183 7.3891 20.0855