+
+\subsection{Other CLOS utilities}
+
+Some other minor CLOS utilities.
+
+\begin{describe}{mac}
+ {default-slot (@<instance> @<slot> @[@<slot-names>@]) \\ \ind
+ @<form>^*}
+ This macro is useful in methods (usually @|:after| methods) on
+ @|shared-initialize|, to set slots to some sensible default values in the
+ case where no suitable initarg was given, and default initialization is too
+ complicated to be done using an initform.
+
+ Set a slot to a default value, obeying the @|shared-initialize| protocol.
+ If (a) the named @<slot> of @<instance> is unbound, and (b) either
+ @<slot-names> is @|t|, or @<slot> is a member of the list @<slot-names>,
+ then evaluate the @<form>s as an implicit @|progn| and store their
+ value in the @<slot>. Otherwise do nothing.
+
+ The @<instance>, @<slot>, and @<slot-names> (if any) are evaluated once
+ each, left-to-right.
+\end{describe}
+
+\begin{describe}{mac}
+ {define-on-demand-slot @<class> @<slot> (@<instance>) \\ \ind
+ @[[ @<declaration>^* @! @<doc-string> @]] \\
+ @<form>^*}
+ This macro makes slots with delayed initialization: rather than being
+ set when the object is constructed, the slot's initial value is only
+ calculated when it's first requested. This is useful if calculating the
+ slot value is expensive and often not required, or if it's not possible to
+ initialize the slot along with the rest of the object because of dependency
+ cycles.
+
+ The macro arranges things as follows. Whenever @|slot-value| is called
+ (possibly indirectly, via a reader function) to read the named @<slot> (a
+ symbol, not evaluated) on an (indirect) instance of @<class>, but the slot
+ is unbound, then @<instance> is bound to the instance in question and the
+ @<form>s are evaluated as an implicit @|progn| within the lexical
+ environment of the @|define-on-demand-slot| call, and the resulting value
+ is used as the initial value of the slot. (Furthermore, a block named
+ @<slot> is wrapped around the @<form>s, allowing an early return if that
+ should be useful.)
+
+ This macro currently works by defining a method on @|slot-unbound|.
+\end{describe}
+
+
+\subsection{Building lists}
+
+Many Lisp functions end up constructing lists. In simple cases, a function
+like @|mapcar| will just do the job directly. In more complex cases, a
+common idiom is to build the list using @|push| for each element in turn; but
+a list built this way ends up in the wrong order, so an additional pass,
+usually using @|nreverse|, is necessary to fix it.
+
+A `list builder' is an object which can be used to construct a list in the
+right order. (Currently, a list-builder is simply a cons cell, whose cdr
+points to the first cons-cell of the list, and whose car points to its last
+cons; an empty list-builder is a cons whose cdr is nil and whose car is the
+cons itself, i.e., @|\#1=(\#1\# . nil)|.)
+