[GiNaC-devel] function classes
Jens Vollinga
vollinga at physik.uni-wuppertal.de
Tue Apr 18 20:51:32 CEST 2006
Dear Chris,
thanks for your analysis and your suggestions. Currently I am wondering
if it would be a good idea to open a special CVS branch for the function
class modifications. With that the release of a GiNaC 1.4 would not be
delayed or poisoned by these big modifications and the development of
the function classes would proceed more publicly.
Chris Dams schrieb:
> GINAC_IMPLEMENT_FUNCTION_OPT(exp_function,
> print_func<print_csrc_float>(&exp_function::do_print_csrc_float).
> print_func<print_latex>(&exp_function::do_print_latex))
>
> This looks a bit too much like the old system IMO. Isn't it possible to
> have virtual functions do_print_csrc_float and do_print_latex? The default
> behaviour of these would then be to print the name of the function
> (prefixed with a backslash in case of do_print_latex) and the argument
> list. Since I found a method virtual const char* class_name() in
> function.h this shouldn't be a problem.
Some kind of macro for the initialization of the static members has to
be used in any case. So I guess you are more concerned about the _OPT
part of it, i.e. the print_func stuff. If one wants to keep the double
dispatch mechanism alive for function classes, there is not much else
one can do but to use a macro such as the one displayed above. Simple
overloading won't do. Of course, the function class itself could sport
good defaults for all functions and thereby making the use of the
considered macro unnecessary in most cases. This is what you are
proposing, but what I found difficult to do. For print_latex I can
imagine two alternatives: \functionname or \mbox{functionname}. Most
built-in functions use the former, but most user defined ones probably
want to use the latter ...
Maybe the following would do: have a (not complete) list of
latex-built-in functions and the default latex printing functions
chooses the \func variant in case the name is in the list, otherwise it
chooses the \mbox variant. Too bloated?
I have (not yet ripe) ideas for print_csrc that are beyond the current
printing mechanism, i.e. one also wants to evaluate function like tgamma
or zeta in C programs of course ...
Apart from that, a default that removes the _function suffix should do
(expect for abs).
> (1) It should be possible to declare a function without the _function
> suffix. The three reasons that you mention for the need of the suffix do
> not apply seem to apply to most user-defined functions, so I think it is
yes, but ...
> good if users can avoid having to suffix every function they define. This
> would avoid having to have code like
>
> ex thing(const ex& x1)
> {
> return thing_function(x1);
> }
maybe there are also advantages of a consistent naming scheme. At first
I had only built-in functions with the _function, or _ginac as richy
suggested, extension that collided with cmath functions and all other
functions went without it. Then I thought about defaults for printing
and because I didn't want to have the _function part of the name
automatically removed for user defined functions (maybe he *really*
wants a function to be named BLA_function and also printed like that
...) I had to write printing functions for almost _every_ built-in
function. It looked kind of short-witted. Then I thought about the
inconsistency for the user: if he uses for example is_exactly_a<> for
built-in functions he has to append _function to the name otherwise not.
Maybe the user chooses a name for his function that is already in cmath
(or any similar dominating header ...), then he might get some subtle
errors in his programs like the ones that are avoided by the special
naming for built-in functions. So in the end I chose to treat every
function the same. But I am still not satisfied with this and I like
what you are proposing! So I will re-think this decision. Maybe some
other trick will do (namespaces?).
> (2) I would like to see a possibility to inherit from another function.
> Maybe by doing something like
>
> class my_sine : public sin_function
> {
> GINAC_DECLARE_INHERITED_FUNCTION(my_sine, sin_function);
> ... etcetera ...
> }
Should be possible. Just needs more macros. Will be done.
Regards,
Jens
More information about the GiNaC-devel
mailing list