(Please don't top-post. Rearranging...) On 4/7/2011 5:45 AM, Karsten Ahnert wrote: > On 04/06/2011 10:53 PM, Bart Janssens wrote: >> On Wed, Apr 6, 2011 at 10:29 PM, Karsten Ahnert >> <[email protected]> wrote: >>> Is there a direct way to transform an expression tree into another one? >>> For example, is it possible that every proto::plus< > node is >>> transformed to it left child? I tried to solve this problem via protos >>> build-in transforms without success. It seems that they are suited for >>> evaluation of an existing tree, but I might be wrong. >> >> Hi Karsten, >> >> I'm pretty sure they can do both. For your example, I think something >> along the lines of this might work (untested): >> >> struct LeftPlus : >> boost::proto::or_ >> < >> boost::proto::terminal<boost::proto::_>, >> boost::proto::when >> < >> boost::proto::plus<boost::proto::_, boost::proto::_>, >> LeftPlus(boost::proto::_left) >> >, >> boost::proto::nary_expr< boost::proto::_, boost::proto::vararg<LeftPlus> >> > >> > >> {}; >> >> This should recurse through expressions and replace sequences of >> pluses with the left-most terminal. You may need some other criteria >> to end the recursion depending on your use case. >> >> Disclaimer: I'm relatively new to proto myself, so the experts might >> have better solutions! >> >> Cheers, > > Great! It works perfectly, alltough I don't understand the code > completely yet.
It takes time, but it'll be worth it. You can't do much with Proto with grokking grammars and transforms. > Another question is: can a node have a state. In my algorithm it would > be nice, if every proto::multiplies< > node stores some intermediate > values which are used during later evaluations of the tree. No. Intermediate expression nodes carry no run-time state in their nodes. They only carry compile-time information in the form of the tag. That's how a plus node is distinguished from a minus node, for instance. If you need to compute intermediate values, you can use a transform to build a parallel structure. -- Eric Niebler BoostPro Computing http://www.boostpro.com
signature.asc
Description: OpenPGP digital signature
_______________________________________________ proto mailing list [email protected] http://lists.boost.org/mailman/listinfo.cgi/proto
