X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/9e91c8e7b5fcdeb6389ac7ccbcd9c77348c4493a..4307347660f48628e307f299eb4fac58ba35fd1a:/doc/concepts.tex diff --git a/doc/concepts.tex b/doc/concepts.tex index 8a8eb02..89dcd8f 100644 --- a/doc/concepts.tex +++ b/doc/concepts.tex @@ -469,6 +469,8 @@ Keyword arguments can be provided in three ways. \end{enumerate} Keyword arguments are provided as a general feature for C functions. +However, Sod has special support for messages which accept keyword arguments +(\xref{sec:concepts.methods.keywords}). %%%-------------------------------------------------------------------------- \section{Messages and methods} \label{sec:concepts.methods} @@ -535,9 +537,7 @@ another, $N$, with respect to a receiving class~$C$, if the class defining $M$ is a more (resp.\ less) specific superclass of~$C$ than the class defining $N$. -\subsection{The standard method combination} -\label{sec:concepts.methods.standard} - +\subsubsection{The standard method combination} The default method combination is called the \emph{standard method combination}; other method combinations are useful occasionally for special effects. The standard method combination accepts four direct method roles, @@ -634,9 +634,7 @@ arguments. If the method body has overwritten its formal arguments, then @|CALL_NEXT_METHOD| will pass along the updated values, rather than the original ones. -\subsection{Aggregating method combinations} -\label{sec:concepts.methods.aggregating} - +\subsubsection{Aggregating method combinations} A number of other method combinations are provided. They are called `aggregating' method combinations because, instead of invoking just the most specific primary method, as the standard method combination does, they invoke @@ -679,6 +677,41 @@ The aggregating method combinations provided are as follows. There is also a @|custom| aggregating method combination, which is described in \xref{sec:fixme.custom-aggregating-method-combination}. + +\subsection{Messages with keyword arguments} +\label{sec:concepts.methods.keywords} + +A message or a direct method may declare that it accepts keyword arguments. +A message which accepts keyword arguments is called a \emph{keyword message}; +a direct method which accepts keyword arguments is called a \emph{keyword +method}. + +While method combinations may set their own rules, usually keyword methods +can only be defined on keyword messages, and all methods defined on a keyword +message must be keyword methods. The direct methods defined on a keyword +message may differ in the keywords they accept, both from each other, and +from the message. If two superclasses of some common class both define +keyword methods on the same message, and the methods both accept a keyword +argument with the same name, then these two keyword arguments must also have +the same type. Different applicable methods may declare keyword arguments +with the same name but different defaults; see below. + +The keyword arguments acceptable in a message sent to an object are the +keywords listed in the message definition, together with all of the keywords +accepted by any applicable method. There is no easy way to determine at +runtime whether a particular keyword is acceptable in a message to a given +instance. + +At runtime, a direct method which accepts one or more keyword arguments +receives an additional argument named @|suppliedp|. This argument is a small +structure. For each keyword argument named $k$ accepted by the direct +method, @|suppliedp| contains a one-bit-wide bitfield member of type +@|unsigned|, also named $k$. If a keyword argument named $k$ was passed in +the message, then @|suppliedp.$k$| is one, and $k$ contains the argument +value; otherwise @|suppliedp.$k$| is zero, and $k$ contains the default value +from the direct method definition if there was one, or an unspecified value +otherwise. + %%%-------------------------------------------------------------------------- \section{Metaclasses} \label{sec:concepts.metaclasses}