I had asked boost-users for suggestions on how to define mutually recursive functions in a DSEL. Here is the original thread. http://lists.boost.org/boost-users/2010/07/60488.php
I am thinking about a solution inspired by Spirit subrules, that looks as follows : #include <boost/fusion/container/vector.hpp> #include <boost/proto/proto.hpp> #include <vector> #include <iostream> using namespace std; namespace mpl=boost::mpl; namespace proto=boost::proto; namespace fusion=boost::fusion; template<typename> struct arg{}; proto::terminal<arg<mpl::int_<0> > >::type const _1 = {{}}; proto::terminal<arg<mpl::int_<1> > >::type const _2 = {{}}; proto::terminal<arg<mpl::int_<2> > >::type const _3 = {{}}; template<typename> struct func {}; #define DECLARE_FUNC(n, x) \ proto::terminal<func<mpl::int_<n> > >::type const x = {{}}; struct _declare_module {}; proto::terminal<_declare_module>::type const declare_module = {{}}; struct _map {}; proto::terminal<_map>::type const map = {{}}; int main() { int i = 41; DECLARE_FUNC(0, det_inverse); DECLARE_FUNC(1, negmul); DECLARE_FUNC(2, vmul); DECLARE_FUNC(3, vadd); DECLARE_FUNC(4, precondition); DECLARE_FUNC(5, fib); BOOST_AUTO(preconditioner,( declare_module[ vadd = _1+_2, negmul = -vmul(_1,_2), det_inverse = 1/(_1*_3-_2*_2), vmul = _1*_2, fib = fib(_1-1) + fib(_1-2), precondition = vmul(map(det_inverse, _1,_2,_3), _1) ] )); std::vector<int> a, b, c; preconditioner->*precondition(a,b,c); proto::display_expr((preconditioner->*precondition)(a,b,c)); return 0; } Basically, the user is forced to declare all the functions using unique identifiers beforehand. He then declares a module containing the definitions of the function. He can then call the functions as module->*func(...). I imagine this can be made to work by parsing the module and executing the correct function based on the type. I would like to ask people's opinions on this forum. Do you guys see any problems? Are there more elegant approaches? Thanks, Manjunath _______________________________________________ proto mailing list proto@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/proto