There are issues with pattern matching, too.
matchdeclare(a,true,b,true);
defmatch(m1,a/b);
m1(x/y) returns [a=x,b=y]
m1(1/2) returns false.
The concept of atom goes back to Democritus: an atom can't be broken up
any further.
Lisp atoms can be broken up further by looking at symbol properties,
name-strings etc,
and for numbers looking at bit representations. Maxima numbers (esp.
rat, complex, bigfloat)
are even further from "atomic".
If we define maxima's map more carefully to require merely that the
main operator must be
acceptable to application in the appropriate fashion, we might not need
to define atom.
that is, map(f, g(a,b,c)) is illegal if
g(f(a),f(b),f(c)) is illegal.
fullmap and mapatom may complicate the situation.
Also not knowing really what the operator "g" is, has problems. e.g. in
1/2 is the operator "/" really?
Does the Lisp rational-number presentation with a / mean there is a
division? Does
the Lisp number 1.2E30 have an "E" in it?
RJF