The slot-list argument to defclass
is a list of elements
where each element defines one slot. Each slot is a list of the form
(SLOT-NAME :TAG1 ATTRIB-VALUE1 :TAG2 ATTRIB-VALUE2 :TAGN ATTRIB-VALUEN)
where SLOT-NAME is a symbol that will be used to refer to the slot. :TAG is a symbol that describes a feature to be set on the slot. ATTRIB-VALUE is a lisp expression that will be used for :TAG.
Valid tags are:
:initarg
A symbol that can be used in the argument list of the constructor to specify a value for this slot of the new instance being created.
A good symbol to use for initarg is one that starts with a colon :
.
The slot specified like this:
(myslot :initarg :myslot)
could then be initialized to the number 1 like this:
(myobject :myslot 1)
See Making New Objects.
:initform
An expression used as the default value for this slot.
If :initform
is left out, that slot defaults to being unbound.
It is an error to reference an unbound slot, so if you need
slots to always be in a bound state, you should always use an
:initform
specifier.
Use slot-boundp
to test if a slot is unbound
(see Predicates and Utilities). Use slot-makeunbound
to set a slot to
being unbound after giving it a value (see Accessing Slots).
The value passed to initform used to be automatically quoted. Thus,
:initform (1 2 3)
will use the list as a value. This is incompatible with CLOS (which would signal an error since 1 is not a valid function) and will likely change in the future, so better quote your initforms if they’re just values.
:type
An unquoted type specifier used to validate data set into this slot. See Type Predicates in Common Lisp Extensions. Here are some examples:
symbol
A symbol.
number
A number type
my-class-name
An object of your class type.
(or null symbol)
A symbol, or nil
.
:allocation
Either :class or :instance (defaults to :instance) used to specify how data is stored. Slots stored per instance have unique values for each object. Slots stored per class have shared values for each object. If one object changes a :class allocated slot, then all objects for that class gain the new value.
:documentation
Documentation detailing the use of this slot. This documentation is exposed when the user describes a class, and during customization of an object.
:accessor
Name of a generic function which can be used to fetch the value of this slot. You can call this function later on your object and retrieve the value of the slot.
This option is in the CLOS spec, but is not fully compliant in EIEIO.
:writer
Name of a generic function which will write this slot.
This option is in the CLOS spec, but is not fully compliant in EIEIO.
:reader
Name of a generic function which will read this slot.
This option is in the CLOS spec, but is not fully compliant in EIEIO.
:custom
A custom :type specifier used when editing an object of this type.
See documentation for defcustom
for details. This specifier is
equivalent to the :type spec of a defcustom
call.
This option is specific to Emacs, and is not in the CLOS spec.
:label
When customizing an object, the value of :label will be used instead of the slot name. This enables better descriptions of the data than would usually be afforded.
This option is specific to Emacs, and is not in the CLOS spec.
:group
Similar to defcustom
’s :group command, this organizes different
slots in an object into groups. When customizing an object, only the
slots belonging to a specific group need be worked with, simplifying the
size of the display.
This option is specific to Emacs, and is not in the CLOS spec.
:printer
This routine takes a symbol which is a function name. The function
should accept one argument. The argument is the value from the slot
to be printed. The function in object-write
will write the
slot value out to a printable form on standard-output
.
The output format MUST be something that could in turn be interpreted
with read
such that the object can be brought back in from the
output stream. Thus, if you wanted to output a symbol, you would need
to quote the symbol. If you wanted to run a function on load, you
can output the code to do the construction of the value.
:protection
This is an old option that is not supported any more.
When using a slot referencing function such as slot-value
, and
the value behind slot is private or protected, then the current
scope of operation must be within a method of the calling object.
This protection is not enforced by the code any more, so it’s only useful as documentation.
Valid values are:
:public
Access this slot from any scope.
:protected
Access this slot only from methods of the same class or a child class.
:private
Access this slot only from methods of the same class.
This option is specific to Emacs, and is not in the CLOS spec.