I am trying to create a transform where I replace occurrences of proto::terminal<term> with proto::terminal<newterm<mpl::int_<N> > >. I want N to increment for every proto::terminal<term> encountered. So far I have the following code : #include <boost/proto/proto.hpp> #include <boost/mpl/int.hpp> #include <boost/mpl/arithmetic.hpp> #include <iostream> using namespace std; namespace proto=boost::proto; namespace mpl=boost::mpl; struct term {}; template<typename> struct newterm {}; proto::terminal<term>::type const a = {{}}; proto::terminal<term>::type const b = {{}}; proto::terminal<term>::type const c = {{}}; struct xform_callable : proto::callable { template<typename> struct result; template<typename This, typename N> struct result<This(const term &, N)> { typedef typename proto::result_of::make_expr<proto::tag::terminal, newterm<N> >::type type; }; template<typename This, typename tag, typename LHS, typename RHS> struct result<This(tag, LHS, RHS)> { typedef typename proto::result_of::make_expr<tag, LHS, RHS>::type type; }; template<typename N> typename proto::result_of::make_expr<proto::tag::terminal, newterm<N> >::type operator()(const term &, N) { return proto::make_expr<proto::tag::terminal>(newterm<N>()); } template<typename tag, typename LHS, typename RHS> typename proto::result_of::make_expr<tag, LHS, RHS>::type operator()(tag, LHS l, RHS r) const { return proto::make_expr<tag>(l, r); } }; struct xform : proto::or_< proto::when< proto::terminal<term>, xform_callable(proto::_value, mpl::next<proto::_state>())>, proto::when< proto::plus<xform, xform>, xform_callable(proto::tag_of<proto::_expr>(), xform(proto::_left, proto::_state), xform(proto::_right, proto::_state))>
{}; int main() { mpl::plus<mpl::int_<0>, mpl::int_<1> >(); proto::display_expr(xform()(a+b/c, mpl::int_<0>())); return 0; } I pass in mpl::int_<0>() as the initial state and call mpl::next when I match proto::terminal<term>. As the output would indicate, this is not working. Every time I think I understand proto transforms, something basic like this stumps me. I will be grateful for any hints on how to accomplish this. Thanks, Manjunath