sub infix: (&f, &g) { return sub ($x) { return f(g($x)); }; } #### sub test ($x) { return $x ~ " test"; } # outputs (&test !* &test) test test say (&test !* &test)('&test !* &test'); #### # Fails with too much recursion say (&test !* (&test !* &test))('&test !* &test !* &test'); #### my $p = &test !* &test; my $q = $p !* &test; # outputs $p = &test !* &test test say $p('$p = &test !* &test'); #should be $p !* test test test (?), but says $p !* test test say $q('$p !* &test'); #### function comp(f, g){ return function(x){ return f(g(x)); } } function test(x){ return x + " test"; } print (comp(test,comp(test,test))("test ")); #### sub comp { $f = shift; $g = shift; return sub { $x = shift; return $f->($g->($x)); }; } sub test { return (shift) . " test"; } print comp(\&test, comp(\&test,\&test))->("test "); #### sub comp { my ($f, $g) = @_; return sub { my $x = shift; return $f->($g->($x)); }; } sub test { return (shift) . " test"; } print comp(\&test, comp(\&test,\&test))->("test ");