If you look at DEFUN in existing implementations, this is much more than just a function definition. It records, for example, the location of the definition for the development environment (development environment), sets documentation, records type information, ...
Often Lisp provides a mechanism in terms of a functional interface. Typical use is then accomplished with a set of macros that provide a convenient interface and side effects in a development environment.
Sometimes with CLOS there is even an object-oriented implementation under a functional interface.
Then the image is as follows
macros <- used by the programmer, convenient to use ^ | functions <- user interface to the implementation ^ | CLOS (classes, instances, generic functions) <- low-level extensible machine
source share