anchor.diff:    ;; These are for argument info
     (number-required 0 :type fixnum)
     (number-optional 0 :type fixnum)
  -  (key/rest-p nil :type boolean)
  -  (keys nil :type (or list boolean)))
  +  (key/rest-p nil :type boolean))
   
   (define-print-object ((message message)) (format t "~S" (message-name message)))
   
  
positive.code:                      (comparison-description nopt msg-nopt)))
                ((not (eq (or keysp restp) msg-key/rest-p))
                 (lose "the reply and message differ in whether they accept &REST or &KEY arguments."))
                ((and (consp msg-keywords)
                      (not (or (and restp (not keysp)) allow-other-keys-p
                               (every (rcurry 'memq keywords) msg-keywords))))
                 (lose "the reply does not accept each of the &KEY arguments ~S." msg-keywords))
                (t (values)))))))
  
  (defun set-arg-info (message lambda-list)
    (multiple-value-bind (nreq nopt keysp restp allow-other-keys-p keywords)
        (analyze-lambda-list lambda-list)
      (setf (message-lambda-list message) lambda-list
            (message-number-required message) nreq
            (message-number-optional message) nopt
            (message-key/rest-p message) (or keysp restp)
            (message-keys message) (if allow-other-keys-p t keywords)))
    (values))
  
  ;;;
  
negative.code:              (if (> x y) "more" "fewer")))
        (with-accessors ((msg-nreq       message-number-required)
                         (msg-nopt       message-number-optional)
                         (msg-key/rest-p message-key/rest-p)) message
          (cond ((not (= nreq msg-nreq))
                 (lose "the reply has ~A required arguments than the message."
                       (comparison-description nreq msg-nreq)))
  