|
Boost Users : |
From: Eric Niebler (eric_at_[hidden])
Date: 2008-07-03 14:59:56
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
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net