Eric Niebler | 3 Jul 20:59

Re: Creating new operators & function under proto

Joel FALCOU wrote:
> Hi,
> 
> I tried follwoing the tutorial to create new functions to use in Proto 
> but it failed.
> Let's say I want to have a new unary function called worker that create 
> an expression
> that ought to be matched by the following grammar :
> 
> struct worker_grammar : or_< terminal< user_func<_> >, function< 
> worker_tag, terminal< user_func<_> > > {};
> I keep getting a 'no type named proto_expr_base in worker_tag' error.

Right, because unless "worker_tag" is a proto expression or a proto 
grammar, it cannot be a parameter to proto::function<>. The grammar 
function<A,B> will match a binary expression with tag::function and 
where the first child matches A and the second child matches B.

You might get a little farther with something like this:

   terminal<worker_tag>::type const worker = {{}};

Now you can say:

   worker('a')

and it will generate an expression that matches the grammar:

   function<terminal<worker_tag>, _>

> Related question, how can I make a new function which tag is a tempalte 
> class whose tempalte parameter is used to change how the associated 
> transform is performed, I tried :
<snip>

If, for example, worker_tag were a template, you might instead do 
something like ....

template<typename Tag, typename Arg>
typename proto::result_of::make_expr<
   proto::tag::function
  ,worker_tag<Tag>
  ,Arg
 >::type
worker(Arg const &arg)
{
   return proto::make_expr<proto::tag::function>(worker_tag<Tag>(), arg);
}

The resulting expression would match the grammar:

   function<terminal<worker_tag<_> >, _>

HTH,

--

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

Gmane