my $inc = sub { return ($_[0] + 1) }; my $dec = sub { return ($_[0] - 1) }; my $zero = sub { return (0) }; sub apply { my ($val, $func, @etc) = @_; if (@etc) { return ($val, apply ($func->($val), @etc)); } else { return ($val, $func->($val)); } } sub counter { return apply (0, @_); } my @ops = ( $inc, $inc, $inc, $dec, $inc, $dec, $dec, $inc, $zero, $inc, $inc, $inc ); print join (' ', counter (@ops)); ---- output == '0 1 2 3 2 3 2 1 2 0 1 2 3'