Next: Shared-Initialize, Previous: Defaulting of Initialization Arguments, Up: Object Creation and Initialization
The :initarg slot option may be specified more than once for a given slot.
The following rules specify when initialization arguments may be multiply defined:
If two or more initialization arguments that initialize the same
slot are given in the arguments to make-instance
, the
leftmost of these initialization arguments in the initialization
argument list supplies the value, even if the initialization arguments
have different names.
If two or more different initialization arguments that initialize the
same slot have default values and none is given explicitly in the
arguments to make-instance
, the initialization argument that
appears in a :default-initargs class option in the most specific
of the classes supplies the value. If a single
:default-initargs class option specifies two or more initialization
arguments that initialize the same slot and none is given
explicitly in the arguments to make-instance
, the leftmost in
the :default-initargs class option supplies the value, and the
values of the remaining default value forms are ignored.
Initialization arguments given explicitly in the arguments to
make-instance
appear to the left of defaulted initialization
arguments. Suppose that the classes C1 and C2 supply the
values of defaulted initialization arguments for different slots,
and suppose that C1 is more specific than C2; then the
defaulted initialization argument whose value is supplied by C1
is to the left of the defaulted initialization argument whose value is supplied by C2 in the defaulted initialization argument list. If a single :default-initargs class option supplies the values of initialization arguments for two different slots, the initialization argument whose value is specified farther to the left in the :default-initargs class option appears farther to the left in the defaulted initialization argument list.
If a slot has both an :initform form and an
:initarg slot option, and the initialization argument is defaulted
using :default-initargs or is supplied to make-instance
,
the captured :initform form is neither used nor evaluated.
The following is an example of the above rules:
(defclass q () ((x :initarg a))) (defclass r (q) ((x :initarg b)) (:default-initargs a 1 b 2))
Form | Defaulted Initialization Argument List | Contents of Slot X
|
---|---|---|
(make-instance 'r) | (a 1 b 2) | 1
|
(make-instance 'r 'a 3) | (a 3 b 2) | 3
|
(make-instance 'r 'b 4) | (b 4 a 1) | 4
|
(make-instance 'r 'a 1 'a 2) | (a 1 a 2 b 2) | 1
|