Macro Def-Many-To-Many

Part of:

package submarine
( def-many-to-many &rest < args > )
Defines a possibly named many-to-many mapping between two
persistent classes. There can be only one unnamed mapping between any
two classes, and any number of named mappings. CLASS*-NAME should be
an (unquoted) symbol with class name.

Defines additional mapping persistent class `NAME' (if `NAME' is
not provided, `CLASS1-NAME-CLASS2-NAME' is used), and for each of
classes, a method that retrieves list of instances of second class
(named like that class or, if the relation is named,
CLASS-NAME-IN-NAME. Mapping class has three slots, `CLASS1-NAME' and
`CLASS2-NAME' that hold instances of first and second class, and
`WEIGHT' that holds an integer representing the strength of the
relationship. The following functions are available:

* A predicate `RELATEDP', taking a keyword argument `RELATION', which
tells whether two objects are in a relation (if `RELATION' is not
provided, the unnamed relation is assumed). It returns a `NAME' or
`CLASS1-NAME-CLASS2-NAME' object. It has an accessor `WEIGHT'.

* A function `RELATE' (`RELATE-IN-NAME') that establishes a
relationship between its two arguments. It takes a key-argument,
`WEIGHT', by default 1. The order in which the object arguments are
provided is irrelevant. `CONNECTION-SPEC' specifies the connection to
be used to create the link table.