flexible and it's possible for an extension to define a new root class which
works very differently from the standard @|SodObject| described here.
-The concrete types described in \xref{sec:structures.common} and
-\ref{sec:structures.root} are declared by the header file @|<sod/sod.h>|.
+The concrete types described in
+\xref[\instead{sections}]{sec:structures.common} and
+\ref{sec:structures.root} are declared by the header file
+@|<sod/sod.h>|.\footnote{%
+ This isn't completely true. The @|SodObject| and @|SodClass| structures
+ are defined in a header called @|<sod/sod-base.h>|, which is generated by
+ the Sod translator; but @|<sod/sod.h>| includes @|<sod/sod-base.h>|, so you
+ can forget about this detail.} %
The definitions described in \xref{sec:structures.layout} are defined in the
header file generated by the containing module.
Instance chains contain slots and vtable pointers, as described below. All
instances have the basic structure of a @|struct sod_instance|.
-\begin{describe}[struct sod_instance]{type}
+\begin{describe}{ty}[struct sod_instance]
{struct sod_instance \{ \\ \ind
const struct sod_vtable *_vt; \-\\
\};}
\end{description}
\end{describe}
-\begin{describe}[struct sod_vtable]{type}
+\begin{describe}{ty}[struct sod_vtable]
{struct sod_vtable \{ \\ \ind
const SodClass *_class; \\
size_t _base; \-\\
define additional root classes, but this is tricky, and not really to be
recommended.
+The class definitions shown in the synopses are intended to be informative,
+but are fictional and can't really work: these classes are really defined by
+Lisp code in the Sod translator, in order to deal with the circularities
+involved at the top of the class/metaclass graph (see
+\xref{sec:concepts.metaclasses.runtime}).
+
\subsection{The SodObject class} \label{sec:structures.root.sodobject}
\label{fig:structures.root.sodobject}
\end{figure}
-\begin{describe}[SodObject]{cls}
+\begin{describe}{cls}[SodObject]
{[nick = obj, metaclass = SodClass,
lisp_metaclass = sod_class] \\
class SodObject \{ \\ \ind
- void init(?);
+ void init(?); \-\\
\}}
The @|SodObject| class defines no slots. Because @|SodObject| has no
The following messages are defined.
- \begin{describe}[obj.init]{msg}{void init(?);}
+ \begin{describe}{msg}[obj.init]{void init(?);}
Initialize a newly allocated instance.
This message uses a custom method combination which works like the
\xref{sec:concepts.lifecycle.birth}.
\end{describe}
- \begin{describe}[obj.teardown]{msg}{int teardown();}
+ \begin{describe}{msg}[obj.teardown]{int teardown();}
Teardown an instance which is no longer required.
The message returns an integer flag. A zero value means that the
\subsection{The SodClass class} \label{sec:structures.root.sodclass}
-\begin{describe}[SodClass]{cls}
+\begin{describe}{cls}[SodClass]
{[nick = cls, link = SodObject] \\
class SodClass: SodObject \{ \\ \ind
const char *name; \\
\end{description}
\end{describe}
-\begin{describe}[struct sod_chain]{type}
+\begin{describe}{ty}[struct sod_chain]
{struct sod_chain \{ \\ \ind
size_t n_classes; \\
const SodClass *const *classes; \\
\end{prog}
for each of $C$'s superclasses $A$ in the same chain in some (unimportant)
order. The (somewhat obtuse) purpose of this union is to engage the `common
-initial sequence' rule of \cite[6.5.2.3]{ISO:1990:IIP,ANSI:1999:AII}.
+initial sequence' rule of \cite[6.5.2.3]{iso-1990:c,ansi-1999:c}.
\subsubsection{The ichain structure}
The @|ichain| structure contains (in order), a pointer