1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00:00

Clarify manual section on &context specializer for methods

* doc/lispref/functions.texi (Generic Functions): Provide a little
  more information on how they work.
This commit is contained in:
Eric Abrahamsen 2017-12-14 12:59:07 -08:00
parent 8e13d3ab1a
commit 94b52207cf

View File

@ -1225,7 +1225,7 @@ This form defines a method like @code{cl-defmethod} does.
@end table
@end defmac
@defmac cl-defmethod name [qualifier] arguments &rest [docstring] body
@defmac cl-defmethod name [qualifier] arguments [&context (expr spec)@dots{}] &rest [docstring] body
This macro defines a particular implementation for the generic
function called @var{name}. The implementation code is given by
@var{body}. If present, @var{docstring} is the documentation string
@ -1252,15 +1252,20 @@ defined with @code{cl-defstruct} (@pxref{Structures,,, cl, Common Lisp
Extensions for GNU Emacs Lisp}), or of one of its parent classes.
@end table
Alternatively, the argument specializer can be of the form
@code{&context (@var{expr} @var{spec})}, in which case the value of
@var{expr} must be compatible with the specializer provided by
@var{spec}; @var{spec} can be any of the forms described above. In
other words, this form of specializer uses the value of @var{expr}
instead of arguments for the decision whether the method is
applicable. For example, @code{&context (overwrite-mode (eql t))}
will make the method compatible only when @code{overwrite-mode} is
turned on.
Method definitions can make use of a new argument-list keyword,
@code{&context}, which introduces extra specializers that test the
environment at the time the method is run. This keyword should appear
after the list of required arguments, but before any @code{&rest} or
@code{&optional} keywords. The @code{&context} specializers look much
like regular argument specializers---(@var{expr} @var{spec})---except
that @var{expr} is an expression to be evaluated in the current
context, and the @var{spec} is a value to compare against. For
example, @code{&context (overwrite-mode (eql t))} will make the method
applicable only when @code{overwrite-mode} is turned on. The
@code{&context} keyword can be followed by any number of context
specializers. Because the context specializers are not part of the
generic function's argument signature, they may be omitted in methods
that don't require them.
The type specializer, @code{(@var{arg} @var{type})}, can specify one
of the @dfn{system types} in the following list. When a parent type