Slots can be accessed in two ways: by use of the primitive function
slot-value
and by use of generic functions generated by
the defclass
form.
The function slot-value
can be used with any of the slot
names specified in the defclass
form to access a specific
slot accessible in an instance of the given class.
The macro defclass
provides syntax for generating methods to
read and write slots. If a reader method is requested,
a method is automatically generated for reading the value of the
slot, but no method for storing a value into it is generated.
If a writer method is requested, a method is automatically
generated for storing a value into the slot, but no method
for reading its value is generated. If an accessor method is
requested, a method for reading the value of the slot and a
method for storing a value into the slot are automatically
generated. Reader and writer methods are implemented using
slot-value
.
When a reader or writer method is specified for a slot, the
name of the generic function to which the generated method
belongs is directly specified. If the name specified for the writer
method is the symbol name
, the name of the
generic function for writing the slot is the symbol
name
, and the generic function takes two arguments: the new
value and the instance, in that order. If the name specified
for the accessor method is the symbol name
, the name of
the generic function for reading the slot is the symbol
name
, and the name of the generic function for writing
the slot is the list (setf name)
.
A generic function created or modified by supplying :reader, :writer, or :accessor slot options can be treated exactly as an ordinary generic function.
Note that slot-value
can be used to read or write the value of a
slot whether or not reader or writer methods exist for that
slot. When slot-value
is used, no reader or writer
methods are invoked.
The macro with-slots
can be used to establish a
lexical environment in which specified slots are lexically
available as if they were variables. The macro with-slots
invokes the function slot-value
to access the specified slots.
The macro with-accessors
can be used to establish a lexical
environment in which specified slots are lexically available through
their accessors as if they were variables. The macro with-accessors
invokes the appropriate accessors to access the specified slots.