anchor.diff:  (defmacro define-association (name endpoints &rest options)
     "
   Define functions to manage the association:
  +
       (name-LINK       a b ...)
       (name-UNLINK     a b ...)
       (name-CONTAINS-P a b ...) --> BOOLEAN
       (name-SIZE)  --> INTEGER
       (name-CLEAR) --> INTEGER
  +
   taking &KEY arguments named for the ROLE names.
  +
   There may be more than two endpoints, in case of ternary, etc associations.
   
   ENDPOINTS      a list of (ROLE &KEY TYPE ACCESSOR SLOT MULTIPLICITY MULTIPLE
  
positive.code:          (contains-p      (scat name '-contains-p)))
  
      `(progn
         ,@(let ((troles (mapcar (lambda (endpoint)
                                   (destructuring-bind (role &key slot &allow-other-keys) endpoint
                                     (list role slot)))
                                 endpoints)))
                (append
                 (when (second (second troles))
                   (list `(ensure-class-slot ',(first (first troles)) ',(second (second troles)))))
                 (when (second (first troles))
                   (list `(ensure-class-slot ',(first (second troles)) ',(second (first troles))))))) 
         (defun ,link (&key ,@link-parameters)
           ,(generate-addset name
                             (first link-parameters) (second link-parameters)
  
negative.code:                If all the types are present and different, then ATTACH and
                 DETACH methods are created for the arguments in any order.
  
      Note: we should review this macro for TYPE vs. CLASS.
            Slots may be accessed only in instances of standard-class classes.
            Accessors may be used with any type.
  
  