A method, possibly with a default/reference implementation, that can have other implementations provided by different backends.
If a multimethod does not have an implementation, a
BackendNotImplementedError is raised.
A backend is an entity that can provide implementations for different functions. It can also (optionally) receive some options from the user about how to process the implementations. A backend can be set permanently or temporarily.
A domain is a collection or grouping of multimethods. A domain’s string, by convention (although not by force), is the name of the module that provides the multimethods.
Dispatching is the process of forwarding a function call to an implementation in a backend.
A backend might have different object types compared to the reference implementation, or it might require some other conversions of objects. Conversion is the process of converting any given object into a library’s native form.
Coercions are conversions that may take a long time, usually those
involving copying or moving of data. As a rule of thumb, conversions
O(log n) (where
n is the size of the object in
memory) should be made into coercions.
Marking is the process of telling the backend what convertor to use for a given argument.