(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
>> <karsten.ahn...@ambrosys.de> 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

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
proto mailing list
proto@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/proto

Reply via email to