test/chimaera.sod: Attach some driver code to test it.
[sod] / doc / sod-protocol.tex
CommitLineData
dea4d055
MW
1%%% -*-latex-*-
2%%%
3%%% Description of the internal class structure and protocol
4%%%
5%%% (c) 2009 Straylight/Edgeware
6%%%
7
8%%%----- Licensing notice ---------------------------------------------------
9%%%
10%%% This file is part of the Simple Object Definition system.
11%%%
12%%% SOD is free software; you can redistribute it and/or modify
13%%% it under the terms of the GNU General Public License as published by
14%%% the Free Software Foundation; either version 2 of the License, or
15%%% (at your option) any later version.
16%%%
17%%% SOD is distributed in the hope that it will be useful,
18%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
19%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20%%% GNU General Public License for more details.
21%%%
22%%% You should have received a copy of the GNU General Public License
23%%% along with SOD; if not, write to the Free Software Foundation,
24%%% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
26\chapter{Protocol overview} \label{ch:proto}
27
28This chapter provides an overview of the Sod translator's internal object
29model. It describes most of the important classes and generic functions, how
30they are used to build a model of a Sod module and produce output code, and
31how an extension might modify the translator's behaviour.
32
33I assume familiarity with the Common Lisp Object System (CLOS). Familiarity
34with the CLOS Metaobject Protocol isn't necessary but may be instructive.
35
36%%%--------------------------------------------------------------------------
37\section{A tour through the translator}
38
39At the very highest level, the Sod translator works in two phases: it
40\emph{parses} source files into an internal representation, and then it
41\emph{generates} output files from the internal representation.
42
43The function @|read-module| is given a pathname for a file: it opens the
44file, parses the program text, and returns a @|module| instance describing
45the classes and other items found.
46
47At the other end, the main output function is @|output-module|, which is
48given a module, an output stream and a
49
50
51%%%--------------------------------------------------------------------------
52\section{Specification conventions} \label{sec:proto.conventions}
53
54Throughout this specification, the phrase `it is an error' indicates that a
55particular circumstance is erroneous and results in unspecified and possibly
56incorrect behaviour. In particular, the situation need not be immediately
57diagnosed, and the consequences may be far-reaching.
58
59The following conventions apply throughout this specification.
60
61\begin{itemize}
62
63\item If a specification describes an argument as having a particular type or
64 syntax, then it is an error to provide an argument not having that
65 particular type or syntax.
66
67\item If a specification describes a function then that function might be
68 implemented as a generic function; it is an error to attempt to (re)define
69 it as a generic function, or to attempt to add methods to it. A function
70 specified as being a generic function will certainly be so; if user methods
71 are permitted on the generic function then this will be specified.
72
73\item Where a class precedence list is specified, either explicitly or
74 implicitly by a class hierarchy, the implementation may include additional
75 superclasses not specified here. Such additional superclasses will not
76 affect the order of specified classes in the class precedence lists either
77 of specified classes themselves or of user-defined subclasses of specified
78 classes.
79
80\item Unless otherwise specified, generic functions use the standard method
81 combination.
82
83\item The specifications for methods are frequently brief; they should be
84 read in conjunction with and in the context of the specification for the
85 generic function and specializing classes, if any.
86
87\item An object $o$ is a \emph{direct instance} of a class $c$ if @|(eq
88 (class-of $o$) $c$)|; $o$ is an \emph{instance} of $c$ if it is a direct
89 instance of any subclass of $c$.
90
91\item If a class is specified as being \emph{abstract} then it is an error to
92 construct direct instances of it, e.g., using @|make-instance|.
93
94\item If an object is specified as being \emph{immutable} then it is an error
95 to mutate it, e.g., using @|(setf (slot-value \ldots) \ldots)|. Programs
96 may rely on immutable objects retaining their state.
97
98\item A value is \emph{fresh} if it is guaranteed to be not @|eql| to any
99 previously existing value.
100
101\item Unless otherwise specified, it is an error to change the class of an
102 instance of any class described here; and it is an error to change the
103 class of an object to a class described here.
104
105\end{itemize}
106
107\subsection{Format of the entries} \label{sec:proto.conventions.format}
108
109Most symbols defined by the protocol have their own entries. An entry begins
110with a header line, showing a synopsis of the symbol on the left, and the
111category (function, class, macro, etc.) on the right.
112
113\begin{describe}{fun}{example-function @<required>
114 \&optional @<optional>
115 \&rest @<rest>
116 \&key :keyword}
117 The synopsis for a function, generic function or method describes the
118 function's lambda-list using the usual syntax. Note that keyword arguments
119 are shown by naming their keywords; in the description, the value passed
120 for the keyword argument @|keyword| is shown as @<keyword>.
121
122 For a method, specializers are shown using the usual @|defmethod| syntax,
123 e.g.,
124 \begin{quote}
125 some-generic-function ((@<specialized> list) @<unspecialized>)
126 \end{quote}
127\end{describe}
128
129\begin{describe}{mac}{example-macro
130 ( @{ @<symbol> @! (@<symbol> @<form>) @}^* ) \\ \push
131 @[[ @<declaration>^* @! @<documentation-string> @]] \\
132 @<body-form>^*}
133 The synopsis for a macro describes the acceptable syntax using the
134 following notation.
135 \begin{itemize}
136 \item Literal symbols, e.g., keywords and parenthesis, are shown in
137 @|monospace|.
138 \item Metasyntactic variables are shown in @<italics>.
139 \item Items are grouped together by braces `@{ $\dots$ @}'. The notation
140 `@{ $\dots$ @}^*' indicates that the enclosed items may be repeated zero
141 or more times; `@{ $\dots$ @}^+' indicates that the enclosed items may be
142 repeated one or more times. This notation may be applied to a single
143 item without the braces.
144 \item Optional items are shown enclosed in brackets `@[ $\dots$ @]'.
145 \item Alternatives are separated by vertical bars `@!'; the vertical bar
146 has low precedence, so alternatives extend as far as possible between
147 bars and up to the enclosing brackets if any.
148 \item A sequence of alternatives enclosed in double-brackets `@[[ $\ldots$
149 @]]' indicates that the alternatives may occur in any order, but each may
150 appear at most once unless marked by a star.
151 \end{itemize}
152 For example, the notation at the head of this example describes syntax
153 for @|let|.
154\end{describe}
155
156
157\begin{describe}{cls}{example-class (direct-super other-direct-super) \&key
158 :initarg}
159 The synopsis for a class lists the class's direct superclasses, and the
160 acceptable initargs in the form of a lambda-list. The initargs may be
161 passed to @|make-instance| when constructing an instance of the class or a
162 subclass of it. If instances of the class may be reinitialized, or if
163 objects can be changed to be instances of the class, then these initargs
164 may also be passed to @|reinitialize-instance| and/or @|change-class| as
165 applicable; the class description will state explicitly when these
166 operations are allowed.
167\end{describe}
168
169%%%--------------------------------------------------------------------------
170\section{C type representation} \label{sec:proto.c-types}
171
172\subsection{Overview} \label{sec:proto.c-types.over}
173
174The Sod translator represents C types in a fairly simple and direct way.
175However, because it spends a fair amount of its time dealing with C types, it
176provides a number of useful operations and macros.
177
178The class hierarchy is shown in~\xref{fig:proto.c-types}.
179
180\begin{figure} \centering
181 \parbox{10pt}{\begin{tabbing}
182 @|c-type| \\ \push
183 @|qualifiable-c-type| \\ \push
184 @|simple-c-type| \\ \push
185 @|c-class-type| \- \\
186 @|tagged-c-type| \\ \push
187 @|c-struct-type| \\
188 @|c-union-type| \\
189 @|c-enum-type| \- \\
190 @|c-pointer-type| \- \\
191 @|c-array-type| \\
192 @|c-function-type|
193 \end{tabbing}}
194 \caption{Classes representing C types}
195\label{fig:proto.c-types}
196\end{figure}
197
198C type objects are immutable unless otherwise specified.
199
200\subsubsection{Constructing C type objects}
201There is a constructor function for each non-abstract class of C type object.
202Note, however, that constructor functions need not generate a fresh type
203object if a previously existing type object is suitable. In this case, we
204say that the objects are \emph{interned}. Some constructor functions are
205specified to return interned objects: programs may rely on receiving the same
206(@|eq|) type object for similar (possibly merely @|equal|) arguments. Where
207not specified, clients may still not rely on receiving fresh objects.
208
209A convenient S-expression notation is provided by the @|c-type| macro. Use
210of this macro is merely an abbreviation for corresponding use of the various
211constructor functions, and therefore interns type objects in the same manner.
212The syntax accepted by the macro can be extended in order to support new
213classes: see @|defctype|, @|c-type-alias| and @|define-c-type-syntax|.
214
215The descriptions of each of the various classes include descriptions of the
216initargs which may be passed to @|make-instance| when constructing a new
217instance of the class. However, the constructor functions and S-expression
218syntax are strongly recommended over direct use of @|make-instance|.
219
220\subsubsection{Printing}
221There are two protocols for printing C types. Unfortunately they have
222similar names.
223\begin{itemize}
224\item The @|print-c-type| function prints a C type value using the
225 S-expression notation. It is mainly useful for diagnostic purposes.
226\item The @|pprint-c-type| function prints a C type as a C-syntax
227 declaration.
228\end{itemize}
229Neither generic function defines a default primary method; subclasses of
230@|c-type| must define their own methods in order to print correctly.
231
232\subsection{The C type root class} \label{sec:proto.c-types.root}
233
234\begin{describe}{cls}{c-type ()}
235 The class @|c-type| marks the root of the built-in C type hierarchy.
236
237 Users may define subclasses of @|c-type|. All non-abstract subclasses must
238 have a primary method defined on @|pprint-c-type|; unless instances of the
239 subclass are interned, a method on @|c-type-equal-p| is also required.
240
241 The class @|c-type| is abstract.
242\end{describe}
243
244\subsection{C type S-expression notation} \label{sec:proto.c-types.sexp}
245
246The S-expression representation of a type is described syntactically as a
247type specifier. Type specifiers fit into two syntactic categories.
248\begin{itemize}
249\item A \emph{symbolic type specifier} consists of a symbol. It has a
250 single, fixed meaning: if @<name> is a symbolic type specifier, then each
251 use of @<name> in a type specifier evaluates to the same (@|eq|) type
252 object, until the @<name> is redefined.
253\item A \emph{type operator} is a symbol; the corresponding specifier is a
254 list whose @|car| is the operator. The remaining items in the list are
255 arguments to the type operator.
256\end{itemize}
257
258\begin{describe}{mac}{c-type @<type-spec> @to @<type>}
259 Evaluates to a C type object, as described by the type specifier
260 @<type-spec>.
261\end{describe}
262
263\begin{describe}{mac}{
264 defctype @{ @<name> @! (@<name>^*) @} @<type-spec> @to @<names>}
265 Defines a new symbolic type specifier @<name>; if a list of @<name>s is
266 given, then all are defined in the same way. The type constructed by using
267 any of the @<name>s is as described by the type specifier @<type-spec>.
268
269 The resulting type object is constructed once, at the time that the macro
270 expansion is evaluated; the same (@|eq|) value is used each time any
271 @<name> is used in a type specifier.
272\end{describe}
273
274\begin{describe}{mac}{c-type-alias @<original> @<alias>^* @to @<aliases>}
275 Defines each @<alias> as being a type operator identical in behaviour to
276 @<original>. If @<original> is later redefined then the behaviour of the
277 @<alias>es changes too.
278\end{describe}
279
280\begin{describe}{mac}{%
281 define-c-type-syntax @<name> @<lambda-list> \\ \push
282 @<form>^* \-\\
283 @to @<name>}
284 Defines the symbol @<name> as a new type operator. When a list of the form
285 @|(@<name> @<argument>^*)| is used as a type specifier, the @<argument>s
286 are bound to fresh variables according to @<lambda-list> (a destructuring
287 lambda-list) and the @<form>s evaluated in order in the resulting lexical
288 environment as an implicit @|progn|. The value should be a Lisp form which
289 will evaluate to the type specified by the arguments.
290
291 The @<form>s may call @|expand-c-type-spec| in order to recursively expand
292 type specifiers among its arguments.
293\end{describe}
294
295\begin{describe}{fun}{expand-c-type-spec @<type-spec> @to @<form>}
296 Returns the Lisp form that @|(c-type @<type-spec>)| would expand into.
297\end{describe}
298
299\begin{describe}{gf}{%
300 print-c-type @<stream> @<type> \&optional @<colon> @<atsign>}
301 Print the C type object @<type> to @<stream> in S-expression form. The
302 @<colon> and @<atsign> arguments may be interpreted in any way which seems
303 appropriate: they are provided so that @|print-c-type| may be called via
304 @|format|'s @|\char`\~/\dots/| command; they are not set when
305 @|print-c-type| is called by Sod functions.
306
307 There should be a method defined for every C type class; there is no
308 default method.
309\end{describe}
310
311\subsection{Comparing C types} \label{sec:proto.c-types.cmp}
312
313It is necessary to compare C types for equality, for example when checking
314argument lists for methods. This is done by @|c-type-equal-p|.
315
316\begin{describe}{gf}{c-type-equal-p @<type>_1 @<type>_2 @to @<boolean>}
317 The generic function @|c-type-equal-p| compares two C types @<type>_1 and
318 @<type>_2 for equality; it returns true if the two types are equal and
319 false if they are not.
320
321 Two types are equal if they are structurally similar, where this property
322 is defined by methods for each individual class; see the descriptions of
323 the classes for the details.
324
325 The generic function @|c-type-equal-p| uses the @|and| method combination.
326
327 \begin{describe}{meth}{c-type-equal-p @<type>_1 @<type>_2}
328 A default primary method for @|c-type-equal-p| is defined. It simply
329 returns @|nil|. This way, methods can specialize on both arguments
330 without fear that a call will fail because no methods are applicable.
331 \end{describe}
332 \begin{describe}{ar-meth}{c-type-equal-p @<type>_1 @<type>_2}
333 A default around-method for @|c-type-equal-p| is defined. It returns
334 true if @<type>_1 and @<type>_2 are @|eql|; otherwise it delegates to the
335 primary methods. Since several common kinds of C types are interned,
336 this is a common case worth optimizing.
337 \end{describe}
338\end{describe}
339
340\subsection{Outputting C types} \label{sec:proto.c-types.output}
341
342\begin{describe}{gf}{pprint-c-type @<type> @<stream> @<kernel>}
343 The generic function @|pprint-c-type| pretty-prints to @<stream> a C-syntax
344 declaration of an object or function of type @<type>. The result is
345 written to @<stream>.
346
347 A C declaration has two parts: a sequence of \emph{declaration specifiers}
348 and a \emph{declarator}. The declarator syntax involves parentheses and
349 operators, in order to reflect the operators applicable to the declared
350 variable. For example, the name of a pointer variable is preceded by @`*';
351 the name of an array is followed by dimensions enclosed in @`['\dots @`]'.
352
353 The @<kernel> argument must be a function designator (though see the
354 standard around-method); it is invoked as
355 \begin{quote} \codeface
356 (funcall @<kernel> @<stream> @<priority> @<spacep>)
357 \end{quote}
358 It should write to @<stream> -- which may not be the same stream originally
359 passed into the generic function -- the `kernel' of the declarator, i.e.,
360 the part to which prefix and/or postfix operators are attached to form the
361 full declarator.
362
363 The methods on @|pprint-c-type| specialized for compound types work by
364 recursively calling @|pprint-c-type| on the subtype, passing down a closure
365 which prints the necessary additional declarator operators before calling
366 the original @<kernel> function. The additional arguments @<priority> and
367 @<spacep> support this implementation technique.
368
369 The @<priority> argument describes the surrounding operator context. It is
370 zero if no type operators are directly attached to the kernel (i.e., there
371 are no operators at all, or the kernel is enclosed in parentheses), one if
372 a prefix operator is directly attached, or two if a postfix operator is
373 directly attached. If the @<kernel> function intends to provide its own
374 additional declarator operators, it should check the @<priority> in order
375 to determine whether parentheses are necessary. See also the
376 @|maybe-in-parens| macro (page~\pageref{mac:maybe-in-parens}).
377
378 The @<spacep> argument indicates whether a space needs to be printed in
379 order to separate the declarator from the declaration specifiers. A kernel
380 which contains an identifier should insert a space before the identifier
381 when @<spacep> is non-nil. An `empty' kernel, as found in an abstract
382 declarator (one that specifies no name), looks more pleasing without a
383 trailing space. See also the @|c-type-space| function
384 (page~\pageref{fun:c-type-space}).
385
386 Every concrete subclass of @|c-type| is expected to provide a primary
387 method on this function. There is no default primary method.
388
389 \begin{describe}{ar-meth}{pprint-c-type @<type> @<stream> @<kernel>}
390 A default around method is defined on @|pprint-c-type| which `canonifies'
391 non-function @<kernel> arguments. In particular:
392 \begin{itemize}
393 \item if @<kernel> is nil, then @|pprint-c-type| is called recursively
394 with a @<kernel> function that does nothing; and
395 \item if @<kernel> is any other kind of object, then @|pprint-c-type| is
396 called recursively with a @<kernel> function that prints the object as
397 if by @|princ|, preceded if necessary by space using @|c-type-space|.
398 \end{itemize}
399 \end{describe}
400\end{describe}
401
402\begin{describe}{fun}{c-type-space @<stream>}
403 Writes a space and other pretty-printing instructions to @<stream> in order
404 visually to separate a declarator from the preceding declaration
405 specifiers. The precise details are subject to change.
406\end{describe}
407
408\begin{describe}{mac}{%
409 maybe-in-parens (@<stream-var> @<guard-form>) \\ \push
410 @<form>^*}
411 The @<guard-form> is evaluated, and then the @<form>s are evaluated in
412 sequence within a pretty-printer logical block writing to the stream named
413 by the symbol @<stream-var>. If the @<guard-form> evaluates to nil, then
414 the logical block has empty prefix and suffix strings; if it evaluates to a
415 non-nil value, then the logical block has prefix and suffix @`(' and @`)'
416 respectively.
417
418 Note that this may cause @<stream> to be bound to a different stream object
419 within the @<form>s.
420\end{describe}
421
422\subsection{Type qualifiers and qualifiable types}
423\label{sec:proto.ctypes.qual}
424
425\begin{describe}{cls}{qualifiable-c-type (c-type) \&key :qualifiers}
426 The class @|qualifiable-c-type| describes C types which can bear
427 `qualifiers' (\Cplusplus\ calls them `cv-qualifiers'): @|const|,
428 @|restrict| and @|volatile|.
429
430 The @<qualifiers> are a list of keyword symbols @|:const|, @|:restrict| and
431 @|:volatile|. There is no built-in limitation to these particular
432 qualifiers; others keywords may be used, though this isn't recommended.
433
434 Two qualifiable types are equal only if they have \emph{matching
435 qualifiers}: i.e., every qualifier attached to one is also attached to
436 the other: order is not significant, and neither is multiplicity.
437
438 The class @|qualifiable-c-type| is abstract.
439\end{describe}
440
441\begin{describe}{gf}{c-type-qualifiers @<type> @to @<list>}
442 Returns the qualifiers of the @|qualifiable-c-type| instance @<type> as an
443 immutable list.
444\end{describe}
445
446\begin{describe}{fun}{qualify-type @<type> @<qualifiers>}
447 The argument @<type> must be an instance of @|qualifiable-c-type|,
448 currently bearing no qualifiers, and @<qualifiers> a list of qualifier
449 keywords. The result is a C type object like @<c-type> except that it
450 bears the given @<qualifiers>.
451
452 The @<type> is not modified. If @<type> is interned, then the returned
453 type will be interned.
454\end{describe}
455
456\begin{describe}{fun}{format-qualifiers @<qualifiers>}
457 Returns a string containing the qualifiers listed in @<qualifiers> in C
458 syntax, with a space after each. In particular, if @<qualifiers> is
459 non-null then the final character of the returned string will be a space.
460\end{describe}
461
462\subsection{Leaf types} \label{sec:proto.c-types.leaf}
463
464A \emph{leaf type} is a type which is not defined in terms of another type.
465In Sod, the leaf types are
466\begin{itemize}
467\item \emph{simple types}, including builtin types like @|int| and @|char|,
468 as well as type names introduced by @|typename|, because Sod isn't
469 interested in what the type name means, merely that it names a type; and
470\item \emph{tagged types}, i.e., enum, struct and union types which are named
471 by a keyword identifying the kind of type, and a \emph{tag}.
472\end{itemize}
473
474\begin{describe}{cls}{simple-c-type (qualifiable-c-type)
475 \&key :qualifiers :name}
476 The class of `simple types'; an instance denotes the type @<qualifiers>
477 @<name>.
478
479 A simple type object maintains a \emph{name}, which is a string whose
480 contents are the C name for the type. The initarg @|:name| may be used to
481 provide this name when calling @|make-instance|.
482
483 Two simple type objects are equal if and only if they have @|string=| names
484 and matching qualifiers.
485
486 A number of symbolic type specifiers for builtin types are predefined as
487 shown in \xref{tab:proto.c-types.simple}. These are all defined as if by
488 @|define-simple-c-type|, so can be used to construct qualified types.
489\end{describe}
490
491\begin{table}
492 \begin{tabular}[C]{|l|l|} \hlx{hv}
493 \textbf{C type} & \textbf{Specifiers} \\ \hlx{vhv}
494 @|void| & @|void| \\ \hlx{vhv}
495 @|char| & @|char| \\ \hlx{v}
496 @|unsigned char| & @|unsigned-char|, @|uchar| \\ \hlx{v}
497 @|signed char| & @|signed-char|, @|schar| \\ \hlx{vhv}
498 @|short| & @|short|, @|signed-short|, @|short-int|,
499 @|signed-short-int| @|sshort| \\ \hlx{v}
500 @|unsigned short| & @|unsigned-short|, @|unsigned-short-int|,
501 @|ushort| \\ \hlx{vhv}
502 @|int| & @|int|, @|signed|, @|signed-int|,
503 @|sint| \\ \hlx{v}
504 @|unsigned int| & @|unsigned|, @|unsigned-int|, @|uint| \\ \hlx{vhv}
505 @|long| & @|long|, @|signed-long|, @|long-int|,
506 @|signed-long-int|, @|slong| \\ \hlx{v}
507 @|unsigned long| & @|unsigned-long|, @|unsigned-long-int|,
508 @|ulong| \\ \hlx{vhv}
509 @|long long| & @|long-long|, @|signed-long-long|,
510 @|long-long-int|, \\
511 & \qquad @|signed-long-long-int|,
512 @|llong|, @|sllong| \\ \hlx{v}
513 @|unsigned long long|
514 & @|unsigned-long-long|, @|unsigned-long-long-int|,
515 @|ullong| \\ \hlx{vhv}
516 @|float| & @|float| \\ \hlx{v}
517 @|double| & @|double| \\ \hlx{vhv}
518 @|va_list| & @|va-list| \\ \hlx{v}
519 @|size_t| & @|size-t| \\ \hlx{v}
520 @|ptrdiff_t| & @|ptrdiff-t| \\ \hlx{vh}
521 \end{tabular}
522 \caption{Builtin symbolic type specifiers for simple C types}
523 \label{tab:proto.c-types.simple}
524\end{table}
525
526\begin{describe}{fun}{make-simple-type @<name> \&optional @<qualifiers>}
527 Return the (unique interned) simple C type object for the C type whose name
528 is @<name> (a string) and which has the given @<qualifiers> (a list of
529 keywords).
530\end{describe}
531
532\begin{describe}{gf}{c-type-name @<type>}
533 Returns the name of a @|simple-c-type| instance @<type> as an immutable
534 string.
535\end{describe}
536
537\begin{describe}{mac}{%
538 define-simple-c-type @{ @<name> @! (@<name>^*) @} @<string>}
539 Define type specifiers for a new simple C type. Each symbol @<name> is
540 defined as a symbolic type specifier for the (unique interned) simple C
541 type whose name is the value of @<string>. Further, each @<name> is
542 defined to be a type operator: the type specifier @|(@<name>
543 @<qualifier>^*)| evaluates to the (unique interned) simple C type whose
544 name is @<string> and which has the @<qualifiers> (which are evaluated).
545\end{describe}
546
547\begin{describe}{cls}{tagged-c-type (qualifiable-c-type)
548 \&key :qualifiers :tag}
549 Provides common behaviour for C tagged types. A @<tag> is a string
550 containing a C identifier.
551
552 Two tagged types are equal if and only if they have the same class, their
553 @<tag>s are @|string=|, and they have matching qualifiers. (User-defined
554 subclasses may have additional methods on @|c-type-equal-p| which impose
555 further restrictions.)
556\end{describe}
557\begin{boxy}[Bug]
558 Sod maintains distinct namespaces for the three kinds of tagged types. In
559 C, there is only one namespace for tags which is shared between enums,
560 structs and unions.
561\end{boxy}
562
563\begin{describe}{gf}{c-tagged-type-kind @<type>}
564 Returns a symbol classifying the tagged @<type>: one of @|enum|, @|struct|
565 or @|union|. User-defined subclasses of @|tagged-c-type| should return
566 their own classification symbols. It is intended that @|(string-downcase
567 (c-tagged-type-kind @<type>))| be valid C syntax.\footnote{%
568 Alas, C doesn't provide a syntactic category for these keywords;
569 \Cplusplus\ calls them a @<class-key>.} %
570\end{describe}
571
572\begin{describe}{cls}{c-enum-type (tagged-c-type) \&key :qualifiers :tag}
573 Represents a C enumerated type. An instance denotes the C type @|enum|
574 @<tag>. See the direct superclass @|tagged-c-type| for details.
575
576 The type specifier @|(enum @<tag> @<qualifier>^*)| returns the (unique
577 interned) enumerated type with the given @<tag> and @<qualifier>s (all
578 evaluated).
579\end{describe}
580\begin{describe}{fun}{make-enum-type @<tag> \&optional @<qualifiers>}
581 Return the (unique interned) C type object for the enumerated C type whose
582 tag is @<tag> (a string) and which has the given @<qualifiers> (a list of
583 keywords).
584\end{describe}
585
586\begin{describe}{cls}{c-struct-type (tagged-c-type) \&key :qualifiers :tag}
587 Represents a C structured type. An instance denotes the C type @|struct|
588 @<tag>. See the direct superclass @|tagged-c-type| for details.
589
590 The type specifier @|(struct @<tag> @<qualifier>^*)| returns the (unique
591 interned) structured type with the given @<tag> and @<qualifier>s (all
592 evaluated).
593\end{describe}
594\begin{describe}{fun}{make-struct-type @<tag> \&optional @<qualifiers>}
595 Return the (unique interned) C type object for the structured C type whose
596 tag is @<tag> (a string) and which has the given @<qualifiers> (a list of
597 keywords).
598\end{describe}
599
600\begin{describe}{cls}{c-union-type (tagged-c-type) \&key :qualifiers :tag}
601 Represents a C union type. An instance denotes the C type @|union|
602 @<tag>. See the direct superclass @|tagged-c-type|
603 for details.
604
605 The type specifier @|(union @<tag> @<qualifier>^*)| returns the (unique
606 interned) union type with the given @<tag> and @<qualifier>s (all
607 evaluated).
608\end{describe}
609\begin{describe}{fun}{make-union-type @<tag> \&optional @<qualifiers>}
610 Return the (unique interned) C type object for the union C type whose tag
611 is @<tag> (a string) and which has the given @<qualifiers> (a list of
612 keywords).
613\end{describe}
614
615\subsection{Pointers and arrays} \label{sec:proto.c-types.ptr-array}
616
617Pointers and arrays are \emph{compound types}: they're defined in terms of
618existing types. A pointer describes the type of objects it points to; an
619array describes the type of array element.
620\begin{describe}{gf}{c-type-subtype @<type>}
621 Returns the underlying type of a compound type @<type>. Precisely what
622 this means depends on the class of @<type>.
623\end{describe}
624
625\begin{describe}{cls}{c-pointer-type (qualifiable-c-type)
626 \&key :qualifiers :subtype}
627 Represents a C pointer type. An instance denotes the C type @<subtype>
628 @|*|@<qualifiers>.
629
630 The @<subtype> may be any C type. Two pointer types are equal if and only
631 if their subtypes are equal and they have matching qualifiers.
632
633 The type specifier @|(* @<type-spec> @<qualifier>^*)| returns a type
634 qualified pointer-to-@<subtype>, where @<subtype> is the type specified by
635 @<type-spec> and the @<qualifier>s are qualifier keywords (which are
636 evaluated). The synonyms @|ptr| and @|pointer| may be used in place of the
637 star @`*'.
638
639 The symbol @|string| is a type specifier for the type of pointer to
640 characters; the symbol @|const-string| is a type specifier for the type
641 pointer to constant characters.
642\end{describe}
643\begin{describe}{fun}{make-pointer-type @<subtype> \&optional @<qualifiers>}
644 Return an object describing the type of qualified pointers to @<subtype>.
645 If @<subtype> is interned, then the returned pointer type object is
646 interned also.
647\end{describe}
648
649\begin{describe}{cls}{c-array-type (c-type) \&key :subtype :dimensions}
650 Represents a multidimensional C array type. The @<dimensions> are a list
651 of dimension specifiers $d_0$, $d_1$, \ldots, $d_{n-1}$; an instance then
652 denotes the C type @<subtype> @|[$d_0$][$d_1$]$\ldots$[$d_{n-1}$]|. An
653 individual dimension specifier is either a string containing a C integral
654 constant expression, or nil which is equivalent to an empty string. Only
655 the first (outermost) dimension $d_0$ should be empty.
656
657 C doesn't actually have multidimensional arrays as a primitive notion;
658 rather, it permits an array (with known extent) to be the element type of
659 an array, which achieves an equivalent effect. C arrays are stored in
660 row-major order: i.e., if we write down the indices of the elements of an
661 array in order of ascending address, the rightmost index varies fastest;
662 hence, the type constructed is more accurately an array of $d_0$ arrays of
663 $d_1$ of \ldots\ arrays of $d_{n-1}$ elements of type @<subtype>. We shall
664 continue to abuse terminology and refer to multidimensional arrays.
665
666 The type specifier @|([] @<type-spec> @<dimension>^*)| constructs a
667 multidimensional array with the given @<dimension>s whose elements have the
668 type specified by @<type-spec>. If no dimensions are given then a
669 single-dimensional array with unspecified extent. The synonyms @|array|
670 and @|vector| may be used in place of the brackets @`[]'.
671\end{describe}
672\begin{describe}{fun}{make-array-type @<subtype> @<dimensions>}
673 Return an object describing the type of arrays with given @<dimensions> and
674 with element type @<subtype> (an instance of @|c-type|). The @<dimensions>
675 argument is a list whose elements are strings or nil; see the description
676 of the class @|c-array-type| above for details.
677\end{describe}
678\begin{describe}{gf}{c-array-dimensions @<type>}
679 Returns the dimensions of @<type>, an array type, as an immutable list.
680\end{describe}
681
682\subsection{Function types} \label{sec:proto.c-types.fun}
683
684\begin{describe}{cls}{c-function-type (c-type) \&key :subtype :arguments}
685 Represents C function types. An instance denotes the C type of a C
686 function which
687\end{describe}
688
689%%%----- That's all, folks --------------------------------------------------
690
691%%% Local variables:
692%%% mode: LaTeX
693%%% TeX-master: "sod.tex"
694%%% TeX-PDF-mode: t
695%%% End: