On 1/15/2011 6:41 AM, Nate Knight wrote: > On Jan 14, 2011, at 12:29 PM, Nate Knight wrote: > >> I've pasted some code below where I am trying to transform expressions of >> the form >> >> (a op b op c)[i] >> >> to >> >> (a[i] op b[i] op c[i]) >> >> I managed to get this to work for the simple case >> >> (a+b)[i] >> >> but I'm curious about how to generalize this to include other operators >> (without explicitly handling them all). Also, as written the transform >> doesn't recurse properly, and I'm having some trouble seeing how to correct >> this.
This is a fun little problem. The answer is very simple, but requires some knowledge of proto's pass_through transform, possessed by proto::nary_expr (and friends): // Take any expression and turn each node // into a subscript expression, using the // state as the RHS. struct Distribute : or_< when<terminal<_>, _make_subscript(_, _state)> , nary_expr<_, vararg<Distribute> > > {}; struct Vectorize : or_< terminal<_> , when<subscript<_, _>, Distribute(_left, _right)> , nary_expr<_, vararg<Vectorize> > > {}; int main() { terminal<char const *>::type a = {"a"}; terminal<char const *>::type b = {"b"}; terminal<char const *>::type c = {"c"}; terminal<int>::type i = {42}; display_expr( (a+b+c)[i] ); display_expr( Vectorize()((a+b+c)[i]) ); } HTH, -- Eric Niebler BoostPro Computing http://www.boostpro.com _______________________________________________ proto mailing list proto@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/proto