| Next | Advanced Programming Techniques | Slide #70 | 
Instead of hardwiring lt, let's specify the comparator as a callback
(as with sort)
        sub make_merger {     
          my ($cmp) = @_;
          return sub {
            my ($s, $t) = @_;
            if (is_empty($s)) { return $t }
            if (is_empty($t)) { return $s }
            my ($sh, $th) = (head($s), head($t));
            my $dir = $cmp->($sh, $th);
            if ($dir <= 0) {
              node($sh, sub { merge(tail($s), $t      ) });
            } else {
              node($th, sub { merge($s      , tail($t)) });
            } 
          };
        }
        $merge_alphabetic = make_merger(sub { $_[0] cmp $_[1] });
        $merge_numeric    = make_merger(sub { $_[0] <=>  $_[1] });
Similarly, parametrize merge in the definition of merge_many.
More examples of function factories in the Bonus Slides
| Next | ![]()  | 
    Copyright © 2000 M-J. Dominus |