Common Lisp the Language, 2nd Edition
![]()
Next: Redefining Classes
Up: Object Creation and
Previous: Initialize-Instance

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)
(setq initargs (default-initargs class 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
checks the supplied initialization arguments to determine whether an
initialization argument was supplied that neither filled a slot nor
supplied an argument to an applicable method. This check could be
implemented using the generic functions class-prototype,
compute-applicable-methods, function-keywords,
and class-slot-initargs. See the third part of the Common
Lisp Object System specification for a description of this
initialization argument check. [The third part has not yet been approved
by X3J13 for inclusion in the forthcoming Common Lisp standard and is
not included in this book.-GLS]
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 at either the Programmer Interface level, the meta-object level, or both.
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 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 by allowing methods to be defined on
make-instance, default-initargs, and
allocate-instance. Parts 2 and 3 of the Common Lisp Object
System specification document each of these generic functions and the
system-supplied primary methods. [The third part has not yet been
approved by X3J13 for inclusion in the forthcoming Common Lisp standard
and is not included in this book.-GLS]
Implementations are permitted to make certain optimizations to
initialize-instance and shared-initialize. The
description of shared-initialize in section 28.2
mentions the possible optimizations.
Because of optimization, the check for valid initialization arguments
might not be implemented using the generic functions
class-prototype, compute-applicable-methods,
function-keywords, and class-slot-initargs. In
addition, methods for the generic function default-initargs
and the system-supplied primary methods for
allocate-instance, initialize-instance, and
shared-initialize might not be called on every call to
make-instance or might not receive exactly the arguments
that would be expected.

![]()
Next: Redefining Classes
Up: Object Creation and
Previous: Initialize-Instance
AI.Repository@cs.cmu.edu