Boost logo

Proto :

Subject: Re: [proto] Using Phoenix inside eUML: mixing grammars
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2011-05-02 01:32:11


On Monday, April 25, 2011 06:39:14 PM Christophe Henry wrote:
> Hi Thomas,
>
> Sorry to come back to the subject so late, I didn't manage before :(
>
> > If you want to use it as a transform you need the evaluator with an
> > appropriate action that does the desired transform... here is an
> > example:
> >
> > struct BuildEventPlusGuard
> > : proto::when<
> > proto::subscript<proto::terminal<event_tag>,
> > phoenix::meta_grammar >,
> > TempRow<none,proto::_left,none,none,
> > phoenix::evaluator(proto::_right, some_cool_action())>()
> > >
> > {};
> >
> > Now, some_cool_action can do the transform that BuildGuards was doing.
>
> Hmmm, I get a compiler error, which was expected (would be too easy
> otherwise ;- ) ), but the error is surprising. The error is that
> phoenix::evaluator seems to believe some_cool_action should be a
> random access fusion sequence (expects an environment?).

You are right ... slippery on my side ... evaluator expects a context, which is
a tuple containing the environment and the actions: http://goo.gl/24fU9

> Anyway, I am hoping not to write any cool transform but simply save
> the type of the phoenix expression so that I can re-create an actor
> later. If I need to rewrite differently what BuildGuards was doing, I
> gain little. I would like phoenix to do the grammar parsing and
> building of actor.

It does ... just pass on proto::_right and it should be good:

struct BuildEventPlusGuard
  : proto::when<
        proto::subscript<
            proto::terminal<event_tag>
          , phoenix::meta_grammar // match the phoenix actor
>
      , TempRow<
            none
          , proto::_left
          , none
          , none
          , proto::_right // Pass the type along. which is a phoenix actor.
>(proto::_right) // Pass the object along. Which is the actor (1)
>
{};

(1): Here you can work around the thing with the possibly uninitialized stuff.
Just copy the phoenix actor (should be cheap, if not optimized away completely).

> Thanks,
> Christophe


Proto list run by eric at boostpro.com