3.2 Slot Options

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.