anchor.diff:         (declare (ignore name))
          (setf (aref array (category-id category))
   	     (if (sender-responds-to-category-p
  -		  (category-spec sender) category) 1 0)))
  +		  (expanded-specification sender) category) 1 0)))
        *category-specs*)
       array))
   
  -#+(or)
  -;;?? assume, for today, that sender's spec is AND and 
  -;; message-spec is OR
  -(defun sender-responds-to-category-p (sender category-spec)
  -  (every (lambda (category)
  -	   (member category category-spec))
  -	 (category-spec sender)))
  +(defmethod update-active-categories ((sender sender-with-categories) max-id)
  +  (let ((current-max-id (length (active-categories sender)))
  +	(new-array (adjust-array (active-categories sender) (1+ max-id))))
  +    (loop for index from current-max-id to max-id do
  +	 (setf (aref new-array index)
  +	       (if (sender-responds-to-category-p
  +		    (expanded-specification sender) 
  +		    (id->category index)) 1 0)))
  +    (setf (slot-value sender 'active-categories)
  +	  new-array)
  +    sender))
   
   (defun sender-responds-to-category-p (sender-spec category-spec)
     (let* ((cat-positive (category-variables category-spec))
  
positive.code:   "Returns the category whose id is id (a number)."
    (gethash id *id->category*))
  
  (defun canonize-category-name (name)
    (typecase name
      (string (intern name *package*))
      (symbol (if (eq (symbol-package name) (find-package :keyword))
  		(intern (symbol-name name) *package*)
  		name))
      (t (error 'bad-category-type-error :name name))))
  
  (defun canonize-category-specification (specification)
    (labels ((doit (x)
  
negative.code: 		    (category-negated-variables value))
  	    (determine-category-variables (or use-spec (list use-name))))
        (when name
  	(setf (gethash use-name *name->category*) value))
        (setf (gethash (category-id value) *id->category*) value)
        value)))
  
  