-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Eric Niebler Sent: 14 March 2009 17:37 To: boost-users@lists.boost.org Subject: Re: [Boost-users] proto: analytical-only math functions Hicham Mouline wrote:
Eric Niebler wrote:
And if I'm right in assuming that the first parameter of derivative is which derivative to take, you'll need to make that information available at compile-time as well, so: let( f(x) = log(x) )[ g(x) = derivative<1>(f, x) ];
I am thinking about user friendliness. I think I will have the user define this:
typedef proto::terminal< function_tag< mpl::size_t<3> > >::type function3; function3 f( x1, x2, x3, x1+ x2+ x3+ c6 ); // after all, store the expression tree at runtime
1. Can I define a constructor for the terminal like this?
You could, but ...
2. Can I store the expression tree somewhere? Inside the function_tag template?
You could store the expression tree within such a function3 object, but only by erasing its type. (See http://www.artima.com/cppsource/type_erasure.html for more on type erasure.)
Look at the type "function3" you've defined above. It has absolutely no compile-time information whatsoever about what expression might be stored inside it. If you want to use this variable in more complicated expressions and do expression template magic to compute derivatives and stuff at compile time, you can't.
The options I offered above make all the compile-time information *about the full expression* available to Proto so you can compute interesting things at compile time.
And I would definitely prefer compile-time as well, but as a user I would call the the derivative function in a scope that is very far from where f is defined. Does that matter? In the syntax you proposed above, what is the "let"? What are the curly and square brackets for? If the derivative function is called outside those square bracket, it will not work? The declaration of f would be earlier than its definition? Will I be able to put regular c++ code that is not related to f/g inside the brackets? Will I be able to use g outside of the brackets? Regards,