The generic function make-instance behaves as if it were defined as follows, except that certain optimizations are permitted:
(defmethod make-instance ((class standard-class) &rest initargs)
...
(let ((instance (apply #'allocate-instance class initargs)))
(apply #'initialize-instance instance initargs)
instance))
(defmethod make-instance ((class-name symbol) &rest initargs)
(apply #'make-instance (find-class class-name) initargs))
The elided code in the definition of make-instance
augments the initargs
with any defaulted initialization arguments and
checks the
resulting
initialization arguments to determine whether an initialization
argument was supplied that neither filled a slot nor supplied an argument
to an applicable method.
The generic function initialize-instance behaves as if it were defined as follows, except that certain optimizations are permitted:
(defmethod initialize-instance ((instance standard-object) &rest initargs)
(apply #'shared-initialize instance t initargs)))
These procedures can be customized.
Customizing at the Programmer Interface level includes using the
:initform
, :initarg
, and :default-initargs
options to
defclass, as well as defining methods
for make-instance,
allocate-instance,
and initialize-instance. It is also possible to define
methods for shared-initialize, which would be invoked by the
generic functions reinitialize-instance,
update-instance-for-redefined-class,
update-instance-for-different-class, and
initialize-instance.
The meta-object level supports additional
customization.
Implementations are permitted to make certain optimizations to initialize-instance and shared-initialize. The description of shared-initialize in Chapter~7 mentions the possible optimizations.