1 \documentclass[noarticle]{strayman}
3 \usepackage[T1]{fontenc}
4 \usepackage[utf8]{inputenc}
5 \usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts}
13 \title{A Sensible Object Design for C}
20 \def\syntleft{\normalfont\itshape}
23 \let\codeface\sffamily
25 \def\ulitleft{\normalfont\codeface}
28 \let\listingsize\relax
30 \let\epsilon\varepsilon
32 \atdef <#1>{\synt{#1}\@scripts}
33 \atdef "#1"{\lit*{#1}\@scripts}
34 \atdef `#1'{\lit{#1}\@scripts}
35 \atdef |#1|{\textsf{#1}\@scripts}
36 \def\dbl@maybe#1{\let\@tempa#1\futurelet\@ch\dbl@maybe@i}
37 \def\dbl@maybe@i{\m@maybe\ifx\@ch\@tempa\@tempa\!\@tempa%
38 \expandafter\@firstoftwo\expandafter\@scripts%
39 \else\@tempa\expandafter\@scripts\fi}
42 \atdef {{\m@maybe\{\@scripts}
43 \atdef }{\m@maybe\}\@scripts}
44 \atdef ({\m@maybe(\@scripts}
45 \atdef ){\m@maybe)\@scripts}
46 \atdef !{\m@maybe|\@scripts}
47 \atdef to{\leavevmode\unskip\quad\m@maybe\longrightarrow\m@maybe@end\quad}
48 \let\m@maybe@end\relax
49 \def\m@maybe{\ifmmode\else$\let\m@maybe@end$\fi}
50 \def\@scripts{\futurelet\@ch\@scripts@i}
52 \atdef ;#1\\{\normalfont\itshape;#1\\}
53 \let\@@grammar\grammar
54 \def\grammar{\def\textbar{\hbox{$|$}}\@@grammar}
56 \begingroup\lccode`\~=`\_\lowercase{\endgroup
57 \def\@scripts@i{\if1\ifx\@ch~1\else\ifx\@ch^1\else0\fi\fi%
58 \expandafter\@scripts@ii\else\expandafter\m@maybe@end\fi}}
59 \def\@scripts@ii#1#2{\m@maybe#1{#2}\@scripts}
61 \def\Cplusplus{C\kern-\p@++}
63 \def\man#1#2{\textbf{#1}(#2)}
65 \begingroup\lccode`\~=`\
75 \global\let\\\textbackslash%
83 \newenvironment{boxy}[1][\q@]{%
84 \dimen@\linewidth\advance\dimen@-1.2pt\advance\dimen@-2ex%
86 \vbox\bgroup\hrule\hbox\bgroup\vrule%
87 \vbox\bgroup\vskip1ex\hbox\bgroup\hskip1ex\minipage\dimen@%
88 \def\@temp{#1}\ifx\@temp\q@\else\leavevmode{\headfam\bfseries#1\quad}\fi%
90 \endminipage\hskip1ex\egroup\vskip1ex\egroup%
91 \vrule\egroup\hrule\egroup%
95 \def\definedescribecategory#1#2{\@namedef{cat!#1}{#2}}
96 \def\describecategoryname#1{%
97 \expandafter\let\expandafter\@tempa\csname cat!#1\endcsname%
98 \ifx\@tempa\relax#1\else\@tempa\fi}
99 \definedescribecategory{fun}{function}
100 \definedescribecategory{gf}{generic function}
101 \definedescribecategory{var}{variable}
102 \definedescribecategory{const}{constant}
103 \definedescribecategory{meth}{primary method}
104 \definedescribecategory{ar-meth}{around-method}
105 \definedescribecategory{be-meth}{before-method}
106 \definedescribecategory{af-meth}{after-method}
107 \definedescribecategory{cls}{class}
108 \definedescribecategory{ty}{type}
109 \definedescribecategory{mac}{macro}
112 \newenvironment{describe}[3][\q@]{%
115 \vspace{\bigskipamount}%
116 \setbox\z@\hbox{\bfseries[\describecategoryname{#2}]}%
117 \dimen@\linewidth\advance\dimen@-\wd\z@%
118 \def\@temp##1 ##2\q@{\message{#2:##1}\label{#2:##1}}%
119 \def\@tempa{#1}\ifx\@tempa\q@\@temp#3 \q@\else\@temp{#1} \\\fi%
120 \edef\@temp{{\the\linewidth}{@{}p{\the\dimen@}%
121 @{\extracolsep{\fill}}l@{\extracolsep{0pt}}}}%
122 \noindent\csname tabular*\expandafter\endcsname\@temp%
123 \tabbing\codeface#3\endtabbing&\unhbox\z@\\\endtabular%
125 \list{}{\rightmargin\z@}\item%
130 \def\push{\quad\=\+\kill}
138 %%%--------------------------------------------------------------------------
141 \section{Generated names}
143 The generated names for functions and objects related to a class are
144 constructed systematically so as not to interfere with each other. The rules
145 on class, slot and message naming exist so as to ensure that the generated
146 names don't collide with each other.
148 The following notation is used in this section.
150 \item[@<class>] The full name of the `focus' class: the one for which we are
152 \item[@<super-nick>] The nickname of a superclass.
153 \item[@<head-nick>] The nickname of the chain-head class of the chain
157 \subsection{Instance layout}
159 %%%--------------------------------------------------------------------------
163 Fortunately, Sod is syntactically quite simple. I've used a little slightly
164 unusual notation in order to make the presentation easier to read.
166 \item $\epsilon$ denotes the empty nonterminal:
170 \item @[@<item>@] means an optional @<item>:
172 \syntax{@[<item>@] ::= $\epsilon$ | <item>}
174 \item @<item>^* means a sequence of zero or more @<item>s:
176 \syntax{@<item>^* ::= $\epsilon$ | @<item>^* <item>}
178 \item @<item>^+ means a sequence of one or more @<item>s:
180 \syntax{@<item>^+ ::= <item> @<item>^*}
182 \item @<item-list> means a sequence of one or more @<item>s separated
185 \syntax{<item-list> ::= <item> | <item-list> "," <item>}
189 \subsection{Lexical syntax}
190 \label{sec:syntax.lex}
192 Whitespace and comments are discarded. The remaining characters are
193 collected into tokens according to the following syntax.
196 <token> ::= <identifier>
198 \alt <string-literal>
200 \alt <integer-literal>
204 This syntax is slightly ambiguous. The following two rules serve to
207 \item Reserved words take precedence. All @<reserved-word>s are
208 syntactically @<identifier>s; Sod resolves the ambiguity in favour of
210 \item `Maximal munch'. In other cases, at each stage we take the longest
211 sequence of characters which could be a token.
214 \subsubsection{Identifiers} \label{sec:syntax.lex.id}
217 <identifier> ::= <id-start-char> @<id-body-char>^*
219 <id-start-char> ::= <alpha-char> | "_"
221 <id-body-char> ::= <id-start-char> @! <digit-char>
223 <alpha-char> ::= "A" | "B" | \dots\ | "Z"
224 \alt "a" | "b" | \dots\ | "z"
225 \alt <extended-alpha-char>
227 <digit-char> ::= "0" | <nonzero-digit-char>
229 <nonzero-digit-char> ::= "1" | "2" $| \cdots |$ "9"
232 The precise definition of @<alpha-char> is left to the function
233 \textsf{alpha-char-p} in the hosting Lisp system. For portability,
234 programmers are encouraged to limit themselves to the standard ASCII letters.
236 \subsubsection{Reserved words} \label{sec:syntax.lex.reserved}
240 "char" | "class" | "code" | "const" | "double" | "enum" |
241 "extern" | "float" | "import" | "int" | "lisp" | "load" | "long"
242 | "restrict" | "short" | "signed" | "struct" | "typename" |
243 "union" | "unsigned" | "void" | "volatile"
246 Many of these are borrowed from~C; however, some (e.g., @"import" and
247 @"lisp") are not, and some C reserved words are not reserved (e.g.,
250 \subsubsection{String and character literals} \label{sec:syntax.lex.string}
253 <string-literal> ::= "\"" @<string-literal-char>^* "\""
255 <char-literal> ::= "'" <char-literal-char> "'"
257 <string-literal-char> ::= any character other than "\\" or "\""
260 <char-literal-char> ::= any character other than "\\" or "'"
263 <char> ::= any single character
266 The syntax for string and character literals differs from~C. In particular,
267 escape sequences such as @`\textbackslash n' are not recognized. The use
268 of string and character literals in Sod, outside of C~fragments, is limited,
269 and the simple syntax seems adequate. For the sake of future compatibility,
270 the use of character sequences which resemble C escape sequences is
273 \subsubsection{Integer literals} \label{sec:syntax.lex.int}
276 <integer-literal> ::= <decimal-integer>
277 \alt <binary-integer>
281 <decimal-integer> ::= <nonzero-digit-char> @<digit-char>^*
283 <binary-integer> ::= "0" @("b"|"B"@) @<binary-digit-char>^+
285 <binary-digit-char> ::= "0" | "1"
287 <octal-integer> ::= "0" @["o"|"O"@] @<octal-digit-char>^+
289 <octal-digit-char> ::= "0" | "1" $| \cdots |$ "7"
291 <hex-integer> ::= "0" @("x"|"X"@) @<hex-digit-char>^+
293 <hex-digit-char> ::= <digit-char>
294 \alt "A" | "B" | "C" | "D" | "E" | "F"
295 \alt "a" | "b" | "c" | "d" | "e" | "f"
298 Sod understands only integers, not floating-point numbers; its integer syntax
299 goes slightly beyond C in allowing a @`0o' prefix for octal and @`0b' for
300 binary. However, length and signedness indicators are not permitted.
302 \subsubsection{Punctuation} \label{sec:syntax.lex.punct}
305 <punctuation> ::= any character other than "\"" or "'"
308 Due to the `maximal munch' rule, @<punctuation> tokens cannot be
311 \subsubsection{Comments} \label{sec:lex-comment}
314 <comment> ::= <block-comment>
319 @<not-star>^* @(@<star>^+ <not-star-or-slash> @<not-star>^*@)^*
325 <not-star> ::= any character other than "*"
327 <not-star-or-slash> ::= any character other than "*" or "/"
329 <line-comment> ::= "//" @<not-newline>^* <newline>
331 <newline> ::= a newline character
333 <not-newline> ::= any character other than newline
336 Comments are exactly as in C99: both traditional block comments `\texttt{/*}
337 \dots\ \texttt{*/}' and \Cplusplus-style `\texttt{//} \dots' comments are
338 permitted and ignored.
340 \subsection{Special nonterminals}
341 \label{sec:special-nonterminals}
343 Aside from the lexical syntax presented above (\xref{sec:lexical-syntax}),
344 two special nonterminals occur in the module syntax.
346 \subsubsection{S-expressions} \label{sec:syntax-sexp}
349 <s-expression> ::= an S-expression, as parsed by the Lisp reader
352 When an S-expression is expected, the Sod parser simply calls the host Lisp
353 system's \textsf{read} function. Sod modules are permitted to modify the
354 read table to extend the S-expression syntax.
356 S-expressions are self-delimiting, so no end-marker is needed.
358 \subsubsection{C fragments} \label{sec:syntax.lex.cfrag}
361 <c-fragment> ::= a sequence of C tokens, with matching brackets
364 Sequences of C code are simply stored and written to the output unchanged
365 during translation. They are read using a simple scanner which nonetheless
366 understands C comments and string and character literals.
368 A C fragment is terminated by one of a small number of delimiter characters
369 determined by the immediately surrounding context -- usually a closing brace
370 or bracket. The first such delimiter character which is not enclosed in
371 brackets, braces or parenthesis ends the fragment.
373 \subsection{Module syntax} \label{sec:syntax-module}
376 <module> ::= @<definition>^*
378 <definition> ::= <import-definition>
379 \alt <load-definition>
380 \alt <lisp-definition>
381 \alt <code-definition>
382 \alt <typename-definition>
383 \alt <class-definition>
386 A module is the top-level syntactic item. A module consists of a sequence of
389 \subsection{Simple definitions} \label{sec:syntax.defs}
391 \subsubsection{Importing modules} \label{sec:syntax.defs.import}
394 <import-definition> ::= "import" <string> ";"
397 The module named @<string> is processed and its definitions made available.
399 A search is made for a module source file as follows.
401 \item The module name @<string> is converted into a filename by appending
402 @`.sod', if it has no extension already.\footnote{%
403 Technically, what happens is \textsf{(merge-pathnames name (make-pathname
404 :type "SOD" :case :common))}, so exactly what this means varies
405 according to the host system.} %
406 \item The file is looked for relative to the directory containing the
408 \item If that fails, then the file is looked for in each directory on the
409 module search path in turn.
410 \item If the file still isn't found, an error is reported and the import
413 At this point, if the file has previously been imported, nothing further
415 This check is done using \textsf{truename}, so it should see through simple
416 tricks like symbolic links. However, it may be confused by fancy things
417 like bind mounts and so on.} %
419 Recursive imports, either direct or indirect, are an error.
421 \subsubsection{Loading extensions} \label{sec:syntax.defs.load}
424 <load-definition> ::= "load" <string> ";"
427 The Lisp file named @<string> is loaded and evaluated.
429 A search is made for a Lisp source file as follows.
431 \item The name @<string> is converted into a filename by appending @`.lisp',
432 if it has no extension already.\footnote{%
433 Technically, what happens is \textsf{(merge-pathnames name (make-pathname
434 :type "LISP" :case :common))}, so exactly what this means varies
435 according to the host system.} %
436 \item A search is then made in the same manner as for module imports
437 (\xref{sec:syntax-module}).
439 If the file is found, it is loaded using the host Lisp's \textsf{load}
442 Note that Sod doesn't attempt to compile Lisp files, or even to look for
443 existing compiled files. The right way to package a substantial extension to
444 the Sod translator is to provide the extension as a standard ASDF system (or
445 similar) and leave a dropping @"foo-extension.lisp" in the module path saying
448 (asdf:operate 'asdf:load-op :foo-extension)
450 which will arrange for the extension to be compiled if necessary.
452 (This approach means that the language doesn't need to depend on any
453 particular system definition facility. It's bad enough already that it
454 depends on Common Lisp.)
456 \subsubsection{Lisp escapes} \label{sec:syntax.defs.lisp}
459 <lisp-definition> ::= "lisp" <s-expression> ";"
462 The @<s-expression> is evaluated immediately. It can do anything it likes.
464 \textbf{Warning!} This means that hostile Sod modules are a security hazard.
465 Lisp code can read and write files, start other programs, and make network
466 connections. Don't install Sod modules from sources that you don't
468 Presumably you were going to run the corresponding code at some point, so
469 this isn't as unusually scary as it sounds. But please be careful.} %
471 \subsubsection{Declaring type names} \label{sec:syntax.defs.typename}
474 <typename-definition> ::=
475 "typename" <identifier-list> ";"
478 Each @<identifier> is declared as naming a C type. This is important because
479 the C type syntax -- which Sod uses -- is ambiguous, and disambiguation is
480 done by distinguishing type names from other identifiers.
482 Don't declare class names using @"typename"; use @"class" forward
483 declarations instead.
485 \subsection{Literal code} \label{sec:syntax-code}
488 <code-definition> ::=
489 "code" <identifier> ":" <identifier> @[<constraints>@]
492 <constraints> ::= "[" <constraint-list> "]"
494 <constraint> ::= @<identifier>^+
497 The @<c-fragment> will be output unchanged to one of the output files.
499 The first @<identifier> is the symbolic name of an output file. Predefined
500 output file names are @"c" and @"h", which are the implementation code and
501 header file respectively; other output files can be defined by extensions.
503 The second @<identifier> provides a name for the output item. Several C
504 fragments can have the same name: they will be concatenated together in the
505 order in which they were encountered.
507 The @<constraints> provide a means for specifying where in the output file
508 the output item should appear. (Note the two kinds of square brackets shown
509 in the syntax: square brackets must appear around the constraints if they are
510 present, but that they may be omitted.) Each comma-separated @<constraint>
511 is a sequence of identifiers naming output items, and indicates that the
512 output items must appear in the order given -- though the translator is free
513 to insert additional items in between them. (The particular output items
514 needn't be defined already -- indeed, they needn't be defined ever.)
516 There is a predefined output item @"includes" in both the @"c" and @"h"
517 output files which is a suitable place for inserting @"\#include"
518 preprocessor directives in order to declare types and functions for use
519 elsewhere in the generated output files.
521 \subsection{Property sets} \label{sec:syntax.propset}
524 <properties> ::= "[" <property-list> "]"
526 <property> ::= <identifier> "=" <expression>
529 Property sets are a means for associating miscellaneous information with
530 classes and related items. By using property sets, additional information
531 can be passed to extensions without the need to introduce idiosyncratic
534 A property has a name, given as an @<identifier>, and a value computed by
535 evaluating an @<expression>. The value can be one of a number of types,
536 though the only operators currently defined act on integer values only.
538 \subsubsection{The expression evaluator} \label{sec:syntax.propset.expr}
541 <expression> ::= <term> | <expression> "+" <term> | <expression> "-" <term>
543 <term> ::= <factor> | <term> "*" <factor> | <term> "/" <factor>
545 <factor> ::= <primary> | "+" <factor> | "-" <factor>
548 <integer-literal> | <string-literal> | <char-literal> | <identifier>
549 \alt "?" <s-expression>
550 \alt "(" <expression> ")"
553 The arithmetic expression syntax is simple and standard; there are currently
554 no bitwise, logical, or comparison operators.
556 A @<primary> expression may be a literal or an identifier. Note that
557 identifiers stand for themselves: they \emph{do not} denote values. For more
558 fancy expressions, the syntax
562 causes the @<s-expression> to be evaluated using the Lisp \textsf{eval}
564 %%% FIXME crossref to extension docs
566 \subsection{C types} \label{sec:syntax.c-types}
568 Sod's syntax for C types closely mirrors the standard C syntax. A C type has
569 two parts: a sequence of @<declaration-specifier>s and a @<declarator>. In
570 Sod, a type must contain at least one @<declaration-specifier> (i.e.,
571 `implicit @"int"' is forbidden), and storage-class specifiers are not
574 \subsubsection{Declaration specifiers} \label{sec:syntax.c-types.declspec}
577 <declaration-specifier> ::= <type-name>
578 \alt "struct" <identifier> | "union" <identifier> | "enum" <identifier>
579 \alt "void" | "char" | "int" | "float" | "double"
580 \alt "short" | "long"
581 \alt "signed" | "unsigned"
584 <qualifier> ::= "const" | "volatile" | "restrict"
586 <type-name> ::= <identifier>
589 A @<type-name> is an identifier which has been declared as being a type name,
590 using the @"typename" or @"class" definitions.
592 Declaration specifiers may appear in any order. However, not all
593 combinations are permitted. A declaration specifier must consist of zero or
594 more @<qualifiers>, and one of the following, up to reordering.
597 \item @"struct" @<identifier>, @"union" @<identifier>, @"enum" @<identifier>
599 \item @"char", @"unsigned char", @"signed char"
600 \item @"short", @"unsigned short", @"signed short"
601 \item @"short int", @"unsigned short int", @"signed short int"
602 \item @"int", @"unsigned int", @"signed int", @"unsigned", @"signed"
603 \item @"long", @"unsigned long", @"signed long"
604 \item @"long int", @"unsigned long int", @"signed long int"
605 \item @"long long", @"unsigned long long", @"signed long long"
606 \item @"long long int", @"unsigned long long int", @"signed long long int"
607 \item @"float", @"double", @"long double"
609 All of these have their usual C meanings.
611 \subsubsection{Declarators} \label{sec:syntax.c-types.declarator}
615 @<pointer>^* <inner-declarator> @<declarator-suffix>^*
617 <inner-declarator> ::= <identifier> | <qualified-identifier>
618 \alt "(" <declarator> ")"
620 <qualified-identifier> ::= <identifier> "." <identifier>
622 <pointer> ::= "*" @<qualifier>^*
624 <declarator-suffix> ::= "[" <c-fragment> "]"
625 \alt "(" <arguments> ")"
627 <arguments> ::= <empty> | "..."
628 \alt <argument-list> @["," "..."@]
630 <argument> ::= @<declaration-specifier>^+ <argument-declarator>
632 <argument-declarator> ::= <declarator> | @[<abstract-declarator>@]
634 <abstract-declarator> ::=
635 @<pointer>^+ | @<pointer>^* <inner-abstract-declarator>
637 <inner-abstract-declarator> ::= "(" <abstract-declarator> ")"
638 \alt @[<inner-abstract-declarator>@] @<declarator-suffix>^+
641 The declarator syntax is taken from C, but with some differences.
643 \item Array dimensions are uninterpreted @<c-fragments>, terminated by a
644 closing square bracket. This allows array dimensions to contain arbitrary
645 constant expressions.
646 \item A declarator may have either a single @<identifier> at its centre or a
647 pair of @<identifier>s separated by a @`.'; this is used to refer to
648 slots or messages defined in superclasses.
650 The remaining differences are (I hope) a matter of presentation rather than
653 \subsection{Defining classes} \label{sec:syntax.class}
656 <class-definition> ::= <class-forward-declaration>
657 \alt <full-class-definition>
660 \subsubsection{Forward declarations} \label{sec:class.class.forward}
663 <class-forward-declaration> ::= "class" <identifier> ";"
666 A @<class-forward-declaration> informs Sod that an @<identifier> will be used
667 to name a class which is currently undefined. Forward declarations are
668 necessary in order to resolve certain kinds of circularity. For example,
672 class Super : SodObject {
681 \subsubsection{Full class definitions} \label{sec:class.class.full}
684 <full-class-definition> ::=
686 "class" <identifier> ":" <identifier-list>
687 "{" @<class-item>^* "}"
689 <class-item> ::= <slot-item> ";"
692 \alt <initializer-item> ";"
695 A full class definition provides a complete description of a class.
697 The first @<identifier> gives the name of the class. It is an error to
698 give the name of an existing class (other than a forward-referenced class),
699 or an existing type name. It is conventional to give classes `MixedCase'
700 names, to distinguish them from other kinds of identifiers.
702 The @<identifier-list> names the direct superclasses for the new class. It
703 is an error if any of these @<identifier>s does not name a defined class.
705 The @<properties> provide additional information. The standard class
706 properties are as follows.
708 \item[@"lisp_class"] The name of the Lisp class to use within the translator
709 to represent this class. The property value must be an identifier; the
710 default is @"sod_class". Extensions may define classes with additional
711 behaviour, and may recognize additional class properties.
712 \item[@"metaclass"] The name of the Sod metaclass for this class. In the
713 generated code, a class is itself an instance of another class -- its
714 \emph{metaclass}. The metaclass defines which slots the class will have,
715 which messages it will respond to, and what its behaviour will be when it
716 receives them. The property value must be an identifier naming a defined
717 subclass of @"SodClass". The default metaclass is @"SodClass".
718 %%% FIXME xref to theory
719 \item[@"nick"] A nickname for the class, to be used to distinguish it from
720 other classes in various limited contexts. The property value must be an
721 identifier; the default is constructed by forcing the class name to
725 The class body consists of a sequence of @<class-item>s enclosed in braces.
726 These items are discussed on the following sections.
728 \subsubsection{Slot items} \label{sec:sntax.class.slot}
733 @<declaration-specifier>^+ <init-declarator-list>
735 <init-declarator> ::= <declarator> @["=" <initializer>@]
738 A @<slot-item> defines one or more slots. All instances of the class and any
739 subclass will contain these slot, with the names and types given by the
740 @<declaration-specifiers> and the @<declarators>. Slot declarators may not
741 contain qualified identifiers.
743 It is not possible to declare a slot with function type: such an item is
744 interpreted as being a @<message-item> or @<method-item>. Pointers to
747 An @<initializer>, if present, is treated as if a separate
748 @<initializer-item> containing the slot name and initializer were present.
752 class Example : Super {
759 class Example : Super {
765 \subsubsection{Initializer items} \label{sec:syntax.class.init}
768 <initializer-item> ::= @["class"@] <slot-initializer-list>
770 <slot-initializer> ::= <qualified-identifier> "=" <initializer>
772 <initializer> :: "{" <c-fragment> "}" | <c-fragment>
775 An @<initializer-item> provides an initial value for one or more slots. If
776 prefixed by @"class", then the initial values are for class slots (i.e.,
777 slots of the class object itself); otherwise they are for instance slots.
779 The first component of the @<qualified-identifier> must be the nickname of
780 one of the class's superclasses (including itself); the second must be the
781 name of a slot defined in that superclass.
783 The initializer has one of two forms.
785 \item A @<c-fragment> enclosed in braces denotes an aggregate initializer.
786 This is suitable for initializing structure, union or array slots.
787 \item A @<c-fragment> \emph{not} beginning with an open brace is a `bare'
788 initializer, and continues until the next @`,' or @`;' which is not within
789 nested brackets. Bare initializers are suitable for initializing scalar
790 slots, such as pointers or integers, and strings.
793 \subsubsection{Message items} \label{sec:syntax.class.message}
798 @<declaration-specifier>^+ <declarator> @[<method-body>@]
801 \subsubsection{Method items} \label{sec:syntax.class.method}
806 @<declaration-specifier>^+ <declarator> <method-body>
808 <method-body> ::= "{" <c-fragment> "}" | "extern" ";"
811 %%%--------------------------------------------------------------------------
812 \section{Class objects}
815 typedef struct SodClass__ichain_obj SodClass;
818 size_t n_classes; /* Number of classes in chain */
819 const SodClass *const *classes; /* Vector of classes, head first */
820 size_t off_ichain; /* Offset of ichain from instance base */
821 const struct sod_vtable *vt; /* Vtable pointer for chain */
822 size_t ichainsz; /* Size of the ichain structure */
826 SodClass *_class; /* Pointer to instance's class */
827 size_t _base; /* Offset to instance base */
830 struct SodClass__islots {
832 /* Basic information */
833 const char *name; /* The class's name as a string */
834 const char *nick; /* The nickname as a string */
836 /* Instance allocation and initialization */
837 size_t instsz; /* Instance layout size in bytes */
838 void *(*imprint)(void *); /* Stamp instance with vtable ptrs */
839 void *(*init)(void *); /* Initialize instance */
841 /* Superclass structure */
842 size_t n_supers; /* Number of direct superclasses */
843 const SodClass *const *supers; /* Vector of direct superclasses */
844 size_t n_cpl; /* Length of class precedence list */
845 const SodClass *const *cpl; /* Vector for class precedence list */
847 /* Chain structure */
848 const SodClass *link; /* Link to next class in chain */
849 const SodClass *head; /* Pointer to head of chain */
850 size_t level; /* Index of class in its chain */
851 size_t n_chains; /* Number of superclass chains */
852 const sod_chain *chains; /* Vector of chain structures */
855 size_t off_islots; /* Offset of islots from ichain base */
856 size_t islotsz; /* Size of instance slots */
859 struct SodClass__ichain_obj {
860 const SodClass__vt_obj *_vt;
861 struct SodClass__islots cls;
864 struct sod_instance {
865 struct sod_vtable *_vt;
870 void *sod_convert(const SodClass *cls, const void *obj)
872 const struct sod_instance *inst = obj;
873 const SodClass *real = inst->_vt->_cls;
874 const struct sod_chain *chain;
877 for (i = 0; i < real->cls.n_chains; i++) {
878 chain = &real->cls.chains[i];
879 if (chain->classes[0] == cls->cls.head) {
880 index = cls->cls.index;
881 if (index < chain->n_classes && chain->classes[index] == cls)
882 return ((char *)cls - inst->_vt._base + chain->off_ichain);
891 %%%--------------------------------------------------------------------------
894 \subsection{Classes and superclasses}
896 A @<full-class-definition> must list one or more existing classes to be the
897 \emph{direct superclasses} for the new class being defined. We make the
898 following definitions.
900 \item The \emph{superclasses} of a class consist of the class itself together
901 with the superclasses of its direct superclasses.
902 \item The \emph{proper superclasses} of a class are its superclasses other
904 \item If $C$ is a (proper) superclass of $D$ then $D$ is a (\emph{proper})
905 \emph{subclass} of $C$.
907 The predefined class @|SodObject| has no direct superclasses; it is unique in
908 this respect. All classes are subclasses of @|SodObject|.
910 \subsection{The class precedence list}
912 Let $C$ be a class. The superclasses of $C$ form a directed graph, with an
913 edge from each class to each of its direct superclasses. This is the
914 \emph{superclass graph of $C$}.
916 In order to resolve inheritance of items, we define a \emph{class precedence
917 list} (or CPL) for each class, which imposes a total order on that class's
918 superclasses. The default algorithm for computing the CPL is the \emph{C3}
919 algorithm \cite{fixme-c3}, though extensions may implement other algorithms.
921 The default algorithm works as follows. Let $C$ be the class whose CPL we
922 are to compute. Let $X$ and $Y$ be two of $C$'s superclasses.
924 \item $C$ must appear first in the CPL.
925 \item If $X$ appears before $Y$ in the CPL of one of $C$'s direct
926 superclasses, then $X$ appears before $Y$ in the $C$'s CPL.
927 \item If the above rules don't suffice to order $X$ and $Y$, then whichever
928 of $X$ and $Y$ has a subclass which appears further left in the list of
929 $C$'s direct superclasses will appear earlier in the CPL.
931 This last rule is sufficient to disambiguate because if both $X$ and $Y$ are
932 superclasses of the same direct superclass of $C$ then that direct
933 superclass's CPL will order $X$ and $Y$.
935 We say that \emph{$X$ is more specific than $Y$ as a superclass of $C$} if
936 $X$ is earlier than $Y$ in $C$'s class precedence list. If $C$ is clear from
937 context then we omit it, saying simply that $X$ is more specific than $Y$.
939 \subsection{Instances and metaclasses}
941 A class defines the structure and behaviour of its \emph{instances}: run-time
942 objects created (possibly) dynamically. An instance is an instance of only
943 one class, though structurally it may be used in place of an instance of any
944 of that class's superclasses. It is possible, with care, to change the class
945 of an instance at run-time.
947 Classes are themselves represented as instances -- called \emph{class
948 objects} -- in the running program. Being instances, they have a class,
949 called the \emph{metaclass}. The metaclass defines the structure and
950 behaviour of the class object.
952 The predefined class @|SodClass| is the default metaclass for new classes.
953 @|SodClass| has @|SodObject| as its only direct superclass. @|SodClass| is
956 \subsection{Items and inheritance}
958 A class definition also declares \emph{slots}, \emph{messages},
959 \emph{initializers} and \emph{methods} -- collectively referred to as
960 \emph{items}. In addition to the items declared in the class definition --
961 the class's \emph{direct items} -- a class also \emph{inherits} items from
964 The precise rules for item inheritance vary according to the kinds of items
967 Some object systems have a notion of `repeated inheritance': if there are
968 multiple paths in the superclass graph from a class to one of its
969 superclasses then items defined in that superclass may appear duplicated in
970 the subclass. Sod does not have this notion.
972 \subsubsection{Slots}
973 A \emph{slot} is a unit of state. In other object systems, slots may be
974 called `fields', `member variables', or `instance variables'.
976 A slot has a \emph{name} and a \emph{type}. The name serves only to
977 distinguish the slot from other direct slots defined by the same class. A
978 class inherits all of its proper superclasses' slots. Slots inherited from
979 superclasses do not conflict with each other or with direct slots, even if
980 they have the same names.
982 At run-time, each instance of the class holds a separate value for each slot,
983 whether direct or inherited. Changing the value of an instance's slot
984 doesn't affect other instances.
986 \subsubsection{Initializers}
989 \subsubsection{Messages}
990 A \emph{message} is the stimulus for behaviour. In Sod, a class must define,
991 statically, the name and format of the messages it is able to receive and the
992 values it will return in reply. In this respect, a message is similar to
993 `abstract member functions' or `interface member functions' in other object
996 Like slots, a message has a \emph{name} and a \emph{type}. Again, the name
997 serves only to distinguish the message from other direct messages defined by
998 the same class. Messages inherited from superclasses do not conflict with
999 each other or with direct messages, even if they have the same name.
1001 At run-time, one sends a message to an instance by invoking a function
1002 obtained from the instance's \emph{vtable}: \xref{sec:fixme-vtable}.
1004 \subsubsection{Methods}
1005 A \emph{method} is a unit of behaviour. In other object systems, methods may
1006 be called `member functions'.
1008 A method is associated with a message. When a message is received by an
1009 instance, all of the methods associated with that message on the instance's
1010 class or any of its superclasses are \emph{applicable}. The details of how
1011 the applicable methods are invoked are described fully in
1012 \xref{sec:fixme-method-combination}.
1014 \subsection{Chains and instance layout}
1017 \include{sod-protocol}
1021 %%% Local variables: