+\subsubsection{Sending messages}
+Sod defines a macro for each message. If a class $C$ defines a message $m$,
+then the macro is called @|$C$_$m$|. The macro takes a pointer to the
+receiving object as its first argument, followed by the message arguments, if
+any, and returns the value returned by the object's effective method for the
+message (if any). If you have a pointer to an instance of any of $C$'s
+subclasses, then you can send it the message; it doesn't matter whether the
+subclass is on the same chain. Note that the receiver argument is evaluated
+twice, so it's not safe to write a receiver expression which has
+side-effects.
+
+For example, suppose we defined
+\begin{prog}
+ [nick = soupy] \\
+ class Super: SodObject \{ \\ \ind
+ void msg(const char *m); \-\\
+ \} \\+
+ class Sub: Super \{ \\ \ind
+ void soupy.msg(const char *m)
+ \{ printf("sub sent `\%s'@\\n", m); \} \-\\
+ \}
+\end{prog}
+then we can send the message like this:
+\begin{prog}
+ Sub *sub = /* \dots\ */; \\
+ Super_msg(sub, "hello");
+\end{prog}
+
+What happens under the covers is as follows. The structure pointed to by the
+instance pointer has a member named @|_vt|, which points to a structure
+called a `virtual table', or \emph{vtable}, which contains various pieces of
+information about the object's direct class and layout, and holds pointers to
+method entries for the messages which the object can receive. The
+message-sending macro in the example above expands to something similar to
+\begin{prog}
+ sub@->_vt.sub.msg(sub, "Hello");
+\end{prog}
+
+The vtable contains other useful information, such as a pointer to the
+instance's direct class's \emph{class object} (described below). The full
+details of the contents and layout of vtables are given in
+\xref{sec:structures.layout.vtable}.