Heterogeneous combinators for expressive metaprogramming