Common Lisp the Language, 2nd Edition

Next: Redefining Classes Up: Object Creation and Previous: Initialize-Instance

### 28.1.9.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)
      (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