anchor.diff:                        (delete-role role sheep)))))
         (delete-reply reply))))
   
  -(defun available-replies (sheep)
  -  (let ((roles (loop for role in (sheep-direct-roles sheep)
  -                  collect (vector (role-name role) (role-position role)))))
  -    (remove-duplicates
  -     (flatten
  -      (append roles (mapcar 'available-replies (sheep-parents sheep)))))))
  -
  -(defun add-readers-to-sheep (readers prop-name sheep)
  -  (loop for reader in readers
  -     do
  -       (ensure-message reader :lambda-list '(sheep))
  -       (ensure-reply reader
  -                     :lambda-list '(sheep)
  -                     :participants (list sheep)
  -                     :function (eval (make-reply-lambda reader
  -                                                        '(sheep)
  -                                                        `((property-value sheep ',prop-name)))))))
  -
  -(defun add-writers-to-sheep (writers prop-name sheep)
  -  (loop for writer in writers
  -     do
  -       (ensure-message writer :lambda-list '(new-value sheep))
  -       (ensure-reply writer
  -                     :lambda-list '(new-value sheep)
  -                     :participants (list =t= sheep)
  -                     :function (eval (make-reply-lambda writer
  -                                                        '(new-value sheep)
  -                                                        `((setf (property-value sheep ',prop-name)
  -                                                                new-value)))))))
  -
  -;;; macro
  +(defun delete-reply (reply)
  +  (let ((message (reply-message reply)))
  +    (setf (message-replies message)
  +          (delete reply (message-replies message)))))
  +
  +(defun delete-role (role sheep)
  +  (setf (sheep-direct-roles sheep)
  +        (delete role (sheep-direct-roles sheep))))
  +
  +;;;
  +;;; User interface
  +;;;
  +
  +;;; Definition
   (defmacro defreply (&rest args)
     (multiple-value-bind (name qualifiers specialized-lambda-list docstring body)
         (parse-defreply args)
  
positive.code:       var-name
        (error "Invalid var name.")))
  
  (defmacro undefreply (&rest args)
    (multiple-value-bind (name qualifiers lambda-list)
        (parse-undefreply args)
  
negative.code:                       (delete-role role sheep)))))
        (delete-reply reply))))
  
  (defun remove-applicable-reply (message qualifiers participants)
    (let ((reply (find-if (lambda (reply)
                            (equal (reply-qualifiers reply)
  