The dual namespace saves most Common Lisp macro-using code from this problem.
In large programs, you'd want to use packages. Those also prevent the problem:
(defmacro mypackage:macro (arg)
`(mypackage:function ,arg))
(flet ((yourpackage:function (arg)))
(mypackage:macro (whatever))
yourpackage:function and mypackage:function are different symbols, so no interference.Also, ANSI CL makes it undefined behavior to rebind a standard function; i.e. (labels ((list () ...)) ...) can behave arbitrarily, and implementations are permitted to signal an error like "cannot rebind cl:list".