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