Traditional Lisp semantics (which Maxima is based on) look first at the
function property of a symbol in function position, and only if it does
not have one do they look at the value.
The translator has the problem that it does not know at translation time
whether a symbol will have a function property at runtime or not. For
efficiency, it makes the assumption that it does not, since it is a
bound value. This is obviously a dangerous assumption. I think it
would be better for translated code to be strictly compatible with
interpreted code, even if that slows it down slightly.
In this particular case, what you would like to say is that the *value*
of f is used rather than its function property. In Lisp, one uses
funcall in this case: (funcall f ...). In Maxima, a perfectly good
syntax for that would be (f)(...). However, that currently parses to
the same thing as f(...). You can work around that by writing
(f+0)(...). That is not pretty, but it does work, whether f is
function-defined or not.
-s