On Sat, Nov 6, 2010 at 2:19 PM, Dave Abrahams <dave@boostpro.com> wrote:
On Sat, Nov 6, 2010 at 5:19 AM, alfC <alfredo.correa@gmail.com> wrote:
> (Note, named parameter boost library is not the proper way to go here
> because the of the level of instrospection I need in the functions,
> and because the use of named parameters is not to omit passing
> parameters but to recognize 'externally' certain parameters).

I would be *very* surprised if there was some kind of introspection
possible that Boost.Parameter didn't allow.  And I don't understand
what you mean about omitting passing parameters or external
recognition.  I think you're reinventing the wheel; a Boost.Parameter
ArgumentPack is essentially a fusion map.

ok, since I am probably missing the point, I am going to be one order of magnitude more specific in defining what I want to achieve.
In the following example I will mix C++ and mathematical language to make the point clear.

In "math", one can define a function of parameters and with some abuse of notation one can use the names of parameters to define functionals (e.g. derivatives), so for example

H(p,q) = p*p + q;

which can be evaluated, e.g. H(1.,2.) == 3. but one can also "invoke" the derivatives of H,

dH/dq(1.,2.) == 4.

To be consistent with the abuse of notation one can also say H(p=1., q=2.) or even H(q=2.,p=1), etc. It is this degree of notational flexibility what I would like to achieve.

Let's switch to C++

double H(double p, double q){
  return p*p+q;
}

if I call H(1.,2.) I get of course the desired result. I would also like to call something like
d<H, q>(1.,2.) which is the numerical derivative of H with respect to q evaluated at p=1., q=2.

That is not possible with the naive definition of H because "q" means nothing in the template parameter of "d".

So the next step is to inform C++ of the naming of the parameters, so I did:

struct p{};
struct q{};
double H(map<pair<p, double>, pair<q, double> > const& args){
       return at_key<p>(args)*at_key<p>(args) + at_key<q>(args);
      // same as return H(at_key<p>(args), at_key<q>(args));
 }

great, now the compiler has some idea of what the parameters are.
I can call this function as

H(make_map<p,q>(1.,2.));
H(make_set(1.,2.));
or even as H(1.,2.)

now the derivative problem:

suppose I already have a magical templated function, called 'derivative' that returns the numerical derivative of a function or function object, when this function has only one argument.

template<double(f)(double)>
double derivative(double const& x){ ...already defined... }

double f(double x){return x*x;}

used as
derivative<f>(1.);

the question is how to define a function "d" that takes a function like H with fusion container arguments, bind it against all arguments except one and calls derivative on that function. For example

d<H, q>(1.,2.);

internally, the code should bind all the parameters except q to its corresponding values in the argument. in this case it is H binded with p=1. and then *derivative* of  H( __, 2.) is called with argument 1.

Christofere pointed example
libs/fusion/example/cookbook/do_the_bind.cpp

seems to be in the right direction but the code is hard to read, not to mention that it doesn't compile.

Thank you,
Alfredo


--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users

--
Sie haben diese Nachricht erhalten, da Sie der Google Groups-Gruppe Boost Users beigetreten sind.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an boostusers@googlegroups.com.
Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an boostusers+unsubscribe@googlegroups.com.
Besuchen Sie die Gruppe unter http://groups.google.com/group/boostusers?hl=de, um weitere Optionen zu erhalten.