123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- % -*- Mode: TeX -*-
- \beginsubSection{Introduction to Slots}
-
- An \term{object} \ofmetaclass{standard-class} has zero or more named
- \term{slots}. The \term{slots} of an \term{object} are determined
- by the \term{class} of the \term{object}. Each \term{slot} can hold
- one value.
- \reviewer{Barmar: All symbols are valid variable names. Perhaps this means
- to preclude the use of named constants? We have a terminology
- problem to solve.}%!!!
- The \term{name} of a \term{slot} is a \term{symbol} that is syntactically
- valid for use as a variable name.
- When a \term{slot} does not have a value, the \term{slot} is said to be
- \term{unbound}. When an unbound \term{slot} is read,
- \reviewer{Barmar: from an object whose metaclass is standard-class?}
- the \term{generic function} \funref{slot-unbound} is invoked. The
- system-supplied primary \term{method}
- for \funref{slot-unbound}
- %Barmar: on STANDARD-CLASS or T?
- %KMP: It said T in the signature info for SLOT-UNBOUND so I copied that to here.
- on \term{class} \typeref{t} signals an error.
- \issue{SLOT-MISSING-VALUES:SPECIFY}
- If \funref{slot-unbound} returns, its \term{primary value}
- is used that time as the \term{value} of the \term{slot}.
- \endissue{SLOT-MISSING-VALUES:SPECIFY}
- The default initial value form for a \term{slot} is defined by
- the \kwd{initform} slot option. When the \kwd{initform} form is used to
- supply a value, it is evaluated in the lexical environment in which
- the \macref{defclass} form was evaluated. The \kwd{initform} along with
- the lexical environment in which the \macref{defclass} form was evaluated
- is called a \term{captured initialization form}.
- For more details, \seesection\ObjectCreationAndInit.
-
- A \term{local slot} is defined to be a \term{slot} that is
- %Barmar says: ``Poor wording. It's "visible" to anyone calling SLOT-VALUE.''
- % Perhaps we mean to be saying "accessible in"? -kmp 11-Oct-90
- %%Ok. I'll substitute accessible. -kmp 6-Jan-91
- %visible
- \term{accessible}
- to exactly one \term{instance},
- namely the one in which the \term{slot} is allocated.
- A \term{shared slot} is defined to be a \term{slot} that is visible to more than one
- \term{instance} of a given \term{class} and its \term{subclasses}.
- A \term{class} is said to define a \term{slot} with a given \term{name} when
- the \macref{defclass} form for that \term{class} contains a \term{slot specifier} with
- that \term{name}. Defining a \term{local slot} does not immediately create
- a \term{slot}; it causes a \term{slot} to be created each time
- an \term{instance} of the \term{class} is created.
- Defining a \term{shared slot} immediately creates a \term{slot}.
-
- The \kwd{allocation} slot option to \macref{defclass} controls the kind
- of \term{slot} that is defined. If the value of the \kwd{allocation} slot
- option is \kwd{instance}, a \term{local slot} is created. If the value of
- \kwd{allocation} is \kwd{class}, a \term{shared slot} is created.
- A \term{slot} is said to be \term{accessible} in an \term{instance}
- of a \term{class} if
- the \term{slot} is defined by the \term{class}
- of the \term{instance} or is inherited from
- a \term{superclass} of that \term{class}.
- At most one \term{slot} of a given \term{name} can be
- \term{accessible} in an \term{instance}.
- A \term{shared slot} defined by a \term{class} is
- \term{accessible} in all \term{instances}
- of that \term{class}.
- A detailed explanation of the inheritance of \term{slots} is given in
- \secref\SlotInheritance.
- \endsubSection%{Slots}
- \beginsubSection{Accessing Slots}
- \term{Slots} can be \term{accessed} in two ways: by use of the primitive function
- \funref{slot-value} and by use of \term{generic functions} generated by
- the \macref{defclass} form.
- \Thefunction{slot-value} can be used with any of the \term{slot}
- names specified in the \macref{defclass} form to \term{access} a specific
- \term{slot} \term{accessible} in an \term{instance} of the given \term{class}.
- The macro \macref{defclass} provides syntax for generating \term{methods} to
- read and write \term{slots}. If a reader \term{method} is requested,
- a \term{method} is automatically generated for reading the value of the
- \term{slot}, but no \term{method} for storing a value into it is generated.
- If a writer \term{method} is requested, a \term{method} is automatically
- generated for storing a value into the \term{slot}, but no \term{method}
- for reading its value is generated. If an accessor \term{method} is
- requested, a \term{method} for reading the value of the \term{slot} and a
- \term{method} for storing a value into the \term{slot} are automatically
- generated. Reader and writer \term{methods} are implemented using
- \funref{slot-value}.
- When a reader or writer \term{method} is specified for a \term{slot}, the
- name of the \term{generic function} to which the generated \term{method}
- belongs is directly specified. If the \term{name} specified for the writer
- \term{method} is the symbol \f{name}, the \term{name} of the
- \term{generic function} for writing the \term{slot} is the symbol
- \f{name}, and the \term{generic function} takes two arguments: the new
- value and the \term{instance}, in that order. If the \term{name} specified
- for the accessor \term{method} is the symbol \f{name}, the \term{name} of
- the \term{generic function} for reading the \term{slot} is the symbol
- \f{name}, and the \term{name} of the \term{generic function} for writing
- the \term{slot} is the list \f{(setf name)}.
- A \term{generic function} created or modified by supplying \kwd{reader},
- \kwd{writer}, or \kwd{accessor} \term{slot} options can be treated exactly
- as an ordinary \term{generic function}.
-
- Note that \funref{slot-value} can be used to read or write the value of a
- \term{slot} whether or not reader or writer \term{methods} exist for that
- \term{slot}. When \funref{slot-value} is used, no reader or writer
- \term{methods} are invoked.
- The macro \macref{with-slots} can be used to establish a
- \term{lexical environment} in which specified \term{slots} are lexically
- available as if they were variables. The macro \macref{with-slots}
- invokes \thefunction{slot-value} to \term{access} the specified \term{slots}.
- The macro \macref{with-accessors} can be used to establish a lexical
- environment in which specified \term{slots} are lexically available through
- their accessors as if they were variables. The macro \macref{with-accessors}
- invokes the appropriate accessors to \term{access} the specified \term{slots}.
- %Symbolics thinks this sentence is not meaningful:
- %Any accessors specified by \macref{with-accessors} must
- %already have been defined before they are used.
- \endsubSection%{Accessing Slots}
- \beginsubsection{Inheritance of Slots and Slot Options}
- \DefineSection{SlotInheritance}
- The set of the \term{names} of all \term{slots} \term{accessible}
- in an \term{instance} of a \term{class} $C$ is the union of
- the sets of \term{names} of \term{slots} defined by $C$ and its
- \term{superclasses}. The structure of an \term{instance} is
- the set of \term{names} of \term{local slots} in that \term{instance}.
- In the simplest case, only one \term{class} among $C$ and its \term{superclasses}
- defines a \term{slot} with a given \term{slot} name.
- If a \term{slot} is defined by a \term{superclass} of $C$\negthinspace,
- the \term{slot} is said to be inherited. The characteristics
- of the \term{slot} are determined by the \term{slot specifier}
- of the defining \term{class}.
- Consider the defining \term{class} for
- a slot $S$\negthinspace. If the value of the \kwd{allocation}
- slot
- option is \kwd{instance}, then $S$ is a \term{local slot} and each
- \term{instance}
- of $C$ has its own \term{slot} named $S$ that stores its own value. If the
- value of the \kwd{allocation} slot
- option is \kwd{class}, then $S$
- is a \term{shared slot}, the \term{class}
- that defined $S$ stores the value, and all
- \term{instances} of $C$ can \term{access} that single \term{slot}.
- If the \kwd{allocation} slot option is omitted, \kwd{instance} is used.
- In general, more than one \term{class} among $C$ and its
- \term{superclasses} can
- define a \term{slot} with a given \term{name}.
- In such cases, only one \term{slot} with
- the given name is \term{accessible} in an \term{instance}
- of $C$\negthinspace, and
- the characteristics of that \term{slot} are
- a combination of the several \term{slot}
- specifiers, computed as follows:
- \beginlist
- \itemitem{\bull} All the \term{slot specifiers} for a given \term{slot} name
- are ordered from most specific to least specific, according to the order in $C$'s
- \term{class precedence list} of the \term{classes} that define them. All references
- to the specificity of \term{slot specifiers} immediately below refers to this
- ordering.
- \itemitem{\bull} The allocation of a \term{slot} is controlled by the most
- specific \term{slot specifier}. If the most specific \term{slot specifier}
- does not contain an \kwd{allocation} slot option, \kwd{instance} is used.
- Less specific \term{slot specifiers} do not affect the allocation.
- \itemitem{\bull} The default initial value form for a \term{slot}
- is the value of the \kwd{initform} slot option in the most specific
- \term{slot specifier} that contains one. If no \term{slot specifier}
- contains an \kwd{initform} slot option, the \term{slot}
- has no default initial value form.
- \itemitem{\bull} The contents of a \term{slot} will always be of type
- \f{(and $T\sub 1$ $\ldots$ $T\sub n$)} where $T\sub 1 \ldots T\sub n$ are
- the values of the \kwd{type} slot options contained in all of the
- \term{slot specifiers}. If no \term{slot specifier} contains the
- \kwd{type} slot option, the contents of the \term{slot} will always be
- \oftype{t}. The consequences of attempting to store in a \term{slot}
- a value that does not satisfy the \term{type} of the \term{slot} are undefined.
- \itemitem{\bull} The set of initialization arguments that initialize a
- given \term{slot} is the union of the initialization arguments declared in
- the \kwd{initarg} slot options in all the \term{slot specifiers}.
- \itemitem{\bull} The \term{documentation string} for a \term{slot} is the value of
- the \kwd{documentation} slot option in the most specific \term{slot}
- specifier that contains one. If no \term{slot specifier} contains a
- \kwd{documentation} slot option, the \term{slot} has no \term{documentation string}.
- \endlist
- A consequence of the allocation rule is that a \term{shared slot} can be
- \term{shadowed}. For example, if a class $C\sub 1$ defines
- a \term{slot} named $S$
- whose value for the \kwd{allocation} slot option is \kwd{class},
- that \term{slot} is \term{accessible}
- in \term{instances} of $C\sub 1$ and all of its
- \term{subclasses}. However, if $C\sub 2$ is a \term{subclass}
- of $C\sub 1$ and also
- defines a \term{slot} named $S$\negthinspace, $C\sub 1$'s
- \term{slot} is not shared
- by \term{instances} of $C\sub 2$ and its \term{subclasses}. When a class
- $C\sub 1$ defines a \term{shared slot}, any subclass $C\sub 2$ of $C\sub
- 1$ will share this single \term{slot}
- unless the \macref{defclass} form for
- $C\sub 2$ specifies a \term{slot} of the same
- \term{name} or there is a \term{superclass}
- of $C\sub 2$ that precedes $C\sub 1$ in the \term{class precedence list} of
- $C\sub 2$ that defines a \term{slot} of the same name.
- A consequence of the type rule is that the value of a \term{slot}
- satisfies the type constraint of each \term{slot specifier} that
- contributes to that \term{slot}. Because the result of attempting to
- store in a \term{slot} a value that does not satisfy the type
- constraint for the \term{slot} is undefined, the value in a \term{slot}
- might fail to satisfy its type constraint.
-
- The \kwd{reader}, \kwd{writer}, and \kwd{accessor} slot options
- create \term{methods} rather than define the characteristics of a \term{slot}.
- Reader and writer \term{methods} are inherited in the sense described in
- \secref\MethodInheritance.
- \term{Methods} that \term{access} \term{slots} use only the name of the
- \term{slot} and the \term{type} of the \term{slot}'s value. Suppose
- a \term{superclass} provides a \term{method} that expects to \term{access} a
- \term{shared slot} of a given \term{name}, and a \term{subclass} defines
- a \term{local slot} with the same \term{name}. If the \term{method} provided
- by the \term{superclass} is used on an \term{instance} of the \term{subclass},
- the \term{method} \term{accesses} the \term{local slot}.
- \endsubsection%{Inheritance of Slots and Slot Options}
|