sub visit_preorder { my ($node) = @_; my ($val, $l, $r) = @$node; return ( sub { return \$val; }, sub { return visit_preorder($l) if defined $l; return; }, sub { return visit_preorder($r) if defined $r; return; }, ); }