X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/58f9b4000fb24a363ba8843ce999e8b9a27c4052..ced609b8c5cc865f25cf5cce91a3d7dc9c85bdee:/doc/clang.tex diff --git a/doc/clang.tex b/doc/clang.tex index b38dc09..6f7e218 100644 --- a/doc/clang.tex +++ b/doc/clang.tex @@ -48,7 +48,8 @@ The class hierarchy is shown in~\xref{fig:codegen.c-types.classes}. @|c-enum-type| \- \\ @|c-pointer-type| \- \\ @|c-array-type| \\ - @|c-function-type| + @|c-function-type| \\ \ind + @|c-keyword-function-type| \- \end{tabbing}} \caption{Classes representing C types} \label{fig:codegen.c-types.classes} @@ -623,7 +624,8 @@ function type is the type of the function's return value. not return nil. \end{describe} -\begin{describe}{fun}{make-argument @ @ @> @} +\begin{describe}{fun} + {make-argument @ @ \&optional @ @> @} Construct and a return a new @ object. The argument has type @, which must be a @|c-type| object, and is named @. @@ -632,14 +634,21 @@ function type is the type of the function's return value. suitable for function definitions. If @ is not nil, then the @'s print representation, with @|*print-escape*| nil, is used as the argument name. + + A @ may be supplied. If the argument is used in a + keyword-argument list (e.g., in a \descref{c-keyword-function-type} + [object]{cls}), and the @ value is provided and non-nil, then its + (unescaped) printed representation is used to provide a default value if + the keyword argument is not supplied by the caller. \end{describe} \begin{describe*} {\dhead{fun}{argument-name @ @> @} - \dhead{fun}{argument-type @ @> @}} - Accessor functions for @|argument| objects. They return the name (for - @|argument-name|) or type (for @|argument-type|) from the object, as passed - to @|make-argument|. + \dhead{fun}{argument-type @ @> @} + \dhead{fun}{argument-default @ @> @}} + Accessor functions for @|argument| objects. They return the appropriate + component of the object, as set by to @|make-argument|. The @ is + nil if no default was provided to @|make-argument|. \end{describe*} \begin{describe}{gf} @@ -736,10 +745,72 @@ function type is the type of the function's return value. \end{prog} \end{describe} +\begin{describe}{cls} + {c-keyword-function-type (c-function-type) + \&key :subtype :arguments :keywords} + Represents `functions' which accept keyword arguments. Of course, actual C + functions can't accept keyword arguments directly, but this type is useful + for describing messages and methods which deal with keyword arguments. + + An instance denotes the type of C function which accepts the position + argument list @, and keyword arguments from the @ + list, and returns @. Either or both of the @ and + @ lists may be empty. (It is important to note the distinction + between a function which doesn't accept keyword arguments, and one which + does but for which no keyword arguments are defined. In particular, the + latter function can be changed later to accept a keyword argument without + breaking compatibility with old code.) The @ and @ + lists must \emph{not} contain @|:ellipsis| markers: a function can accept + keywords, or a variable-length argument tail, but not both. + + Keyword arguments may (but need not) have a \emph{default value} which is + supplied to the function body if the keyword is omitted. + + Keyword functions are never considered to be the same as ordinary + functions. Two keyword function types are considered to be the same if + their return types are the same, and their positional argument lists consist of + arguments with the same type, in the same order: the keyword arguments + accepted by the functions is not significant. + + Keyword functions are constructed using an extended version of the @|fun| + specifier used for ordinary C function types. The extended syntax is as + follows. + \begin{prog} + (fun \=@ + @{ (@ @) @}^* \+ \\ + @{ \=:keys @{ (@ @ @[@@]) @}^* + @[. @
@] @! \+ \\ + . @ @} + \end{prog} + where either the symbol @|:keys| appears literally in the specifier, or the + @ evaluates to a list containing the symbol @|:keys|. (If neither of + these circumstances obtains, then the specifier constructs an ordinary + function type.) + + See the description of \descref{c-function-type}{cls} for how a trailing + @ is handled. + + The list of @s and @s describes the positional + arguments. The list of @s, @s and @s + describes the keyword arguments. +\end{describe} + \begin{describe}{fun} {make-function-type @ @ @> @} Construct and return a new function type, returning @ and accepting the @. + + If the @ list contains a @|:keys| marker, then a + \descref{c-keyword-function-type}[object]{cls} is returned: those arguments + preceding the @|:keys| marker form the positional argument list, and those + following the marker form the list of keyword arguments. +\end{describe} + +\begin{describe}{fun} + {make-keyword-function-type @ @ @ + \nlret @} + Construct and return a new keyword-function type, returning @ and + accepting the @ and @. \end{describe} \begin{describe}{gf} @@ -756,6 +827,62 @@ function type is the type of the function's return value. @|commentify-argument-names| to the argument list of the given type. \end{describe} +\begin{describe}{fun}{reify-variable-argument-tail @ @> @} + If the @ list contains an @|:ellipsis| marker, then replace it + with a @|va_list|. The name for the new argument, if any, is taken from + the \descref{*sod-ap*}[variable]{var}. The new list is returned; the + original list is not modified, but may share structure with the new list. +\end{describe} + +\begin{describe}{fun}{merge-keyword-lists @ @> @} + Merge a number of keyword-argument lists together and return the result. + + The @ parameter is a list consisting of a number of @|(@ + . @)| pairs: in each pair, @ is a list of + \descref{argument}{cls} objects, and @ is either nil or an object + whose printed representation describes the origin of the corresponding + @ list, suitable for inclusion in an error message. + + The resulting list contains exactly one argument for each distinct argument + name appearing in the input @; this argument will contain the + default value from the earliest occurrence in the input @ of an + argument with that name. + + If the same name appears multiple times with different types, an error is + signalled quoting the name, conflicting types, and (if non-nil) the origins + of the offending argument objects. +\end{describe} + +\begin{describe}{fun} + {pprint-c-function-type @ @ + @ @} + Provides the top-level structure for printing C function types. + + Output is written to @ to describe a function type returning + @, whose declarator kernel (containing the name, and any + further type operands) will be printed by @, and whose + arguments, if any, will be printed by @. + + The @ function is a standard kernel-printing function + following the \descref{pprint-c-type}[protocol]{gf}. + + The @ function is given a single argument, which is the + @ to print on. It should not print the surrounding parentheses. + + The output written to @ looks approximately like + \begin{prog} + @ @(@) + \end{prog} +\end{describe} + +\begin{describe}{fun}{pprint-argument-list @ @ @> @} + Print an argument list to @. + + The @ is a list of \descref{argument}[objects]{cls}, optionally + containing an @|:ellipsis| marker. The function returns true if any + arguments were actually printed. +\end{describe} + \subsection{Parsing C types} \label{sec:clang.c-types.parsing} @@ -902,6 +1029,10 @@ Temporary names are represented by objects which implement a simple protocol. @^*} \end{describe} +\begin{describe}{fun} + {format-banner-comment @ @ \&rest @} +\end{describe} + \begin{table} \begin{tabular}[C]{ll>{\codeface}l} \hlx*{hv} \thd{Class name} & @@ -913,6 +1044,8 @@ Temporary names are represented by objects which implement a simple protocol. @|set| & @ @ & @ = @; \\ \hlx{v} @|update| & @ @ @ & @ @= @; \\ \hlx{v} + @|cond| & @ @ @ & @ ? @ : @ + \\ \hlx{v} @|return| & @ & return @[@@]; \\ \hlx{v} @|break| & --- & break; \\ \hlx{v} @@ -921,18 +1054,26 @@ Temporary names are represented by objects which implement a simple protocol. @|call| & @ @|\&rest| @ & @(@_1, $\ldots$, - @_n) \\ \hlx{vhv} + @_n) \\ \hlx{v} + @|banner| & @ @|\&rest| @ + & /* @ */ \\ \hlx{vhv} @|block| & @ @ & \{ @[@@] @ \} \\ \hlx{v} @|if| & @ @ @|\&optional| @ & if (@) @ @[else @@] \\ \hlx{v} + @|for| & @ @ @ @ & + for (@; @; @) @ \\ \hlx{v} @|while| & @ @ & while (@) @ \\ \hlx{v} @|do-while| & @ @ & do @ while (@); \\ \hlx{v} - @|function| & @ @ @ & - \vtop{\hbox{\strut @_0 @(@_1 @_1, $\ldots$, + @|function| & + \vtop{\hbox{\strut @ @ @} + \hbox{\strut \quad @|\&optional @|} + \hbox{\strut \quad @|\&rest| @}} & + \vtop{\hbox{\strut @[/* @ */@]} + \hbox{\strut @_0 @(@_1 @_1, $\ldots$, @_n @_n @[, \dots@])} \hbox{\strut \quad @}} \\ \hlx*{vh} \end{tabular} @@ -962,6 +1103,9 @@ Temporary names are represented by objects which implement a simple protocol. \begin{describe}{gf}{emit-decls @ @} \end{describe} +\begin{describe}{fun}{emit-banner @ @ \&rest @} +\end{describe} + \begin{describe}{gf}{codegen-push @} \end{describe}