On Wednesday 13 October 2010 22:46:40 Eric Niebler wrote:
> On 10/13/2010 11:54 AM, Thomas Heller wrote:
> > On Wednesday 13 October 2010 20:15:55 Eric Niebler wrote:
> >> Possibly. But now, you're explicitly constructing a terminal with a
> >> reference_wrapper as a value. Proto doesn't know how to treat
> >> reference_wrapper when evaluating Phoenix expression because you
> >> haven't told it how. You'll need to fit this into your evaluation
> >> strategy somehow. It will be a good test to see how truly extensible
> >> your proposed mechanism is.
> > 
> > Ok, i have to admit, it gets a little messy here. We probably would
> > like to specialize our generic evaluator based on the terminal tag.
> > Which takes care of: a) regular terminals (as in captured by value) b)
> > things like reference wrapper c) placeholders as you suggested them.
> > I don't have a good solution to that problem. Anyone else?
> 
> Not sure yet. This needs thought.
> 
> > The only thing i can think of right know is to introduce a special tag
> > for a reference. It would be great if we could make proto::terminals
> > with different tags, or let's not call them terminals but nullary
> > expressions.
> 
> Proto already lets you define nullary expressions with custom tags.
> Might be handy here.
> 
> <snip>

Ok, this looks promising. I haven't been able to construct nullary 
expressions with proto::make_expr. So i assumed it was not possible :)
Reinvestigating. I think this might be a good solution to phoenix::value and 
phoenix::reference.

> >> Simple. They become:
> >>   typedef
> >>   
> >>     actor<proto::terminal<phoenix_placeholder<mpl::int_<0> > >::type>
> >>   
> >>   arg1_type;
> >>   
> >>   arg1_type const arg1 = {};
> >> 
> >> And then your default evaluator changes to handle placeholders:
> >>     template <typename Tag>
> >>     struct generic_evaluator
> >>     
> >>       : proto::or_<
> >>       : 
> >>             proto::when<
> >>             
> >>                 proto::terminal<phoenix_placeholder<proto::_> >
> >>               
> >>               , fusion_at(proto::_value, proto::_state)
> >>           
> >>           , proto::_default<eval_grammar>
> >>     
> >>     {};
> >> 
> >> or something. If placeholder are part of the core, there's nothing
> >> stopping you from doing this. You can also handle reference_wrappers
> >> here, but that feels like a hack to me. There should be a way for
> >> end-users to customize how Phoenix handles terminal types like
> >> reference_wrapper.
> > 
> > The problem i am having with approach to tackle placeholders, is that i
> > still can't see how this would solve the grand "placeholder
> > unification" problem
> 
> There are two aspects of "placeholder unification":
> 
> 1) Using phoenix placeholders in other EDSLs.
> 2) Using placeholders from other EDSL in Phoenix.
> 
> (1) is solved by making the phoenix domain a sub-domain of
> proto::default_domain. (2) is not yet solved, but can be trivially done
> so by changing the above evaluator to:
> 
> struct Placeholder
> 
>   : proto::when<
> 
>         proto::and_<
>             proto::terminal<proto::_>
>           , proto::if_<boost::is_placeholder<proto::_value>()>
> 
>       , fusion_at(proto::_value, proto::_state)
> 
> {};
> 
> template<class Tag>
> struct generic_evaluator>
> 
>   : proto::or_<
> 
>         Placeholder
>       , _default<eval_grammar>
> 
> {};
> 
> Note the use of some hook-able boost::is_placeholder trait.
> 
> <snip>

Right, that makes sense!

For the rest, see the other post.
<snip> see other post.
_______________________________________________
proto mailing list
proto@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/proto

Reply via email to