Creating new operators & function under proto

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. 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 : struct worker_grammar : or_< terminal< user_func<_> >, function< worker_tag<_>, terminal< user_func<_> > > {}; but it failed too. Thanks in advance -- Joel FALCOU Research Engineer @ Institut d'Electronique Fondamentale Université PARIS SUD XI France

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 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
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
::type worker(Arg const &arg) { return proto::make_exprproto::tag::function(worker_tag<Tag>(), arg); }
The resulting expression would match the grammar:
function
participants (2)
-
Eric Niebler
-
Joel FALCOU