LISP-SYMBOL-REDEFINITIONCLtL only says that special forms can not be redefined. But this doesn't solve the general problem of redefining system functions.
Proposal LISP-SYMBOL-REDEFINITION:MAR89-X3J13
Except where explicitly allowed, the consequences are undefined if any of the following actions are performed on symbols exported from the COMMON-LISP package:
1. Binding or altering its value (lexically or dynamically) 2. Defining, undefining, or binding it as a function 3. Defining, undefining, or binding it as a macro or compiler-macro 4. Defining it as a type specifier (defstruct, defclass, define-condition, deftype) 5. Defining it as a structure (defstruct) 6. Defining it as a declaration (declaration, define-declaration) 7. Using it as a symbol macro 8. Altering its print name (this may already be prohibited) 9. Altering its package 10. Tracing it 11. Declaring or proclaiming it special 12. Declaring or proclaiming its type or ftype 13. Uninterning or unexporting it from the package COMMON-LISP 14. Defining a setf method for it (defsetf, define-setf-method, defining, undefining, or binding the function named (SETF symbol)) 15. Defining it as a method combination type 16. Using it as the class-name argument to SETF of FIND-CLASS
If such a symbol is not globally defined as a variable or a constant, it is allowed to lexically bind it as a variable or as a symbol-macro and declare the type of that binding.
If such a symbol is not defined as a function, macro, or special form, it is allowed to (lexically) bind it as a function and to declare the ftype of that binding and to trace that binding.
If such a symbol is not defined as a function, macro, or special form, it is allowed to (lexically) bind it as a macro.
If such a symbol does not have a setf method defined for it, it is allowed to (lexically) bind the function named (SETF symbol).
(FLET ((OPEN (filename &key direction) (format t "Open called....") (OPEN filename :direction direction))) (with-open-file (x "frob" :direction ':output) (format t "was Open called?")))
is undefined; for example, the macro expansion of with-open-file might refer to the OPEN function and might not.
might signal an error.
Allowing arbitrary redefinition of symbols in the system would place severe restrictions on implementations not to actually use those symbols in macro expansions of other symbols, in function calls, etc. While some looser restrictions might do for any particular Common Lisp implementation, there seems to be no good way to distinguish between those symbols that are redefinable and those that are not.
In general, programs can redefine functions safely by creating new symbols in their own package, possibly shadowing the name.
Fewer check for lexical redefinition, since such redefinition is not as dangerous. Certainly, there are some symbols that are never used in macro expansions of the standard Common Lisp macros. However, implementations do differ on the behavior of macro expansions.
COMMON-LISP package.