walk(x, inner, outer) = outer(x) walk(x::Expr, inner, outer) = outer(Expr(x.head, map(inner, x.args)...)) postwalk(f, x) = walk(x, x -> postwalk(f, x), f) prewalk(f, x) = walk(f(x), x -> prewalk(f, x), identity)