Common Lisp the Language, 2nd Edition


next up previous contents index
Next: Redefining Classes Up: Object Creation and Previous: Initialize-Instance

28.1.9.7. Definitions of Make-Instance and Initialize-Instance

change_begin
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.
change_end



next up previous contents index
Next: Redefining Classes Up: Object Creation and Previous: Initialize-Instance


AI.Repository@cs.cmu.edu