[GiNaC-devel] function classes
Chris Dams
Chris.Dams at mi.infn.it
Wed Apr 19 12:24:22 CEST 2006
Dear Jens,
On Tue, 18 Apr 2006, Jens Vollinga wrote:
> 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.
Yes, I think that is a good idea. Do you plan to release 1.4 soon? I still
have some changes in my local CVS-tree that I would like to see going into
it, but that I would like to test a bit more before comitting them.
Unfortunately, it involves adding two new functions and two new function
options, all coded within the old system, of course... :-(.
And you will also have to document your new tinfo-system. The tutorial
still uses the old one.
> 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 ...
Yes, I think the function class should provide good defaults.
> 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?
There could be an implementation using GINAC_IMPLEMENT_FUNCTION_OPT for
built-in functions and the default \mbox{functionname} for user-defined
ones. On the other hand, considering the fact that after it a "(" will
come, I think \mbox{functionname} is not too bad as an implementation even
for, say, the sine.
> > (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?).
Hmmm... It sounds like every solution has disadvantages. Yet another ugly
idea: a function that is declared as thing_function, has
GINAC_DECLARE_FUNCTION also emit the code friend ex thing(const
ex&x){return thing_function(x);}. Note the use of "friend" to be able to
declare an ordinary function inside a class body.
Best,
Chris
More information about the GiNaC-devel
mailing list