Definitions of Make-Instance and Initialize-Instance (original) (raw)
ANSI Common Lisp 7 Objects
7.1 Object Creation and Initialization
7.1.7 Definitions of Make-Instance and 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) ... (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-instanceaugments 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 todefclass, as well as defining methodsfor make-instance, allocate-instance, and initialize-instance. It is also possible to definemethods 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.