pub trait Visitor<'a, 'b> {
type Producer: ExprProducer<'a, 'b>;
fn visit_expr(&mut self, expr: CExpr<'b>) -> Option<&'a Expr<'a>>;
fn detach_allocator(&self) -> Option<&'a Allocator<'a>>;
fn visit_expr_(&mut self, expr: CExpr<'b>) -> Option<Expr<'a>> { ... }
fn allocator(&self) -> &'a Allocator<'a> { ... }
}