5. Methods and functions
In this chapter the most important algorithms provided by GiNaC will be
described. Some of them are implemented as functions on expressions,
others are implemented as methods provided by expression objects. If
they are methods, there exists a wrapper function around it, so you can
alternatively call it in a functional way as shown in the simple
example:
| ...
cout << "As method: " << sin(1).evalf() << endl;
cout << "As function: " << evalf(sin(1)) << endl;
...
|
The general rule is that wherever methods accept one or more parameters
(arg1, arg2, …) the order of arguments the function
wrapper accepts is the same but preceded by the object to act on
(object, arg1, arg2, …). This approach is the
most natural one in an OO model but it may lead to confusion for MapleV
users because where they would type A:=x+1; subs(x=2,A);
GiNaC
would require A=x+1; subs(A,x==2);
(after proper declaration of
A
and x
). On the other hand, since MapleV returns 3 on
A:=x^2+3; coeff(A,x,0);
(GiNaC: A=pow(x,2)+3;
coeff(A,x,0);
) it is clear that MapleV is not trying to be consistent
here. Also, users of MuPAD will in most cases feel more comfortable
with GiNaC's convention. All function wrappers are implemented
as simple inline functions which just call the corresponding method and
are only provided for users uncomfortable with OO who are dead set to
avoid method invocations. Generally, nested function wrappers are much
harder to read than a sequence of methods and should therefore be
avoided if possible. On the other hand, not everything in GiNaC is a
method on class ex
and sometimes calling a function cannot be
avoided.