anchor.diff:  
   	     (defun ,(symb 'add-on- element-type '-added-callback) (bag callback)
   	       (declare (,bag-type bag)
  -			((function (,root-type ,element-type) t) callback))
  +			((function (,bag-type ,element-type) t) callback))
   	       (vector-push-extend callback (,added-callbacks bag))
   	       bag)
   
   	     (defun ,(symb 'add-on- element-type '-removed-callback) (bag callback)
   	       (declare (,bag-type bag)
  -			((function (,root-type ,element-type) t) callback))
  +			((function (,bag-type ,element-type) t) callback))
   	       (vector-push-extend callback (,removed-callbacks bag))
   	       bag)
   
   	     (defun ,(symb 'remove-on- element-type '-added-callback) (bag callback)
   	       (declare (,bag-type bag)
  -			((function (,root-type ,element-type) t) callback))
  +			((function (,bag-type ,element-type) t) callback))
   	       (setf (,removed-callbacks bag)
   		     (delete callback (,removed-callbacks bag) :count 1))
   	       bag)
   
   	     (defun ,(symb 'remove-on- element-type '-removed-callback) (bag callback)
   	       (declare (,bag-type bag)
  -			((function (,root-type ,element-type) t) callback))
  +			((function (,bag-type ,element-type) t) callback))
   	       (setf (,removed-callbacks bag)
   		     (delete callback (,removed-callbacks bag) :count 1))
   	       bag)
   
  -	     (defun ,(symb 'rummage- element-type '-bag ) (bag predicate)
  -	       (declare (,bag-type bag)
  -			((function (,element-type) boolean) predicate))
  -	       (let ((r (,(symb 'make- rummager-type) :predicate predicate)))
  -		 (%add-rummager bag r)
  -		 r))
  -
  -	     (defun ,(symb 'stop- element-type '-rummaging) (bag rummage)
  -	       (declare (,bag-type bag) (,rummager-type rummage))
  -	       (%remove-rummager bag rummage))))))))
  +	     (defun ,start-rummaging (bag-or-rummager predicate)
  +	       (declare	((function (,element-type) boolean) predicate))
  +	       (etypecase bag-or-rummager
  +		 (,rummager-type
  +		  (,start-rummaging (,rummager-bag bag-or-rummager)
  +				    predicate))
  +		 (,bag-type
  +		  (let ((r (,(symb 'make- rummager-type)
  +			     :predicate predicate
  +			     :parent bag-or-rummager
  +			     :bag (,init))))
  +		    (%add-rummager bag-or-rummager r)
  +		    r))))
  +
  +	     (defun ,stop-rummaging (rummage)
  +	       (declare (,rummager-type rummage))
  +	       (%remove-rummager rummage))))))))
  
positive.code: 		      (make-array 0 :element-type '(or ,element-type null) :adjustable t
  				  :fill-pointer 0))
  		    (%make-callback-array ()
  		      (make-array 0 :element-type '(function (,root-type ,element-type) t)
  				  :adjustable t :fill-pointer 0))
  
  		    (%remove-item-from-cache (bag pos-in-item-array)
  
negative.code: 	    :type (array fixnum (*)))
  	   (holes-in-items nil :type list)
  	   (added-callbacks
  	    (make-array 0 :element-type '(function (,bag-type ,element-type) t)
  			:adjustable t :fill-pointer 0)
  	    :type (array (function (,bag-type ,element-type) t) (*)))
  	   (removed-callbacks
  	    (make-array 0 :element-type '(function (,bag-type ,element-type) t)
  				:adjustable t :fill-pointer 0)
  	    :type (array (function (,bag-type ,element-type) t) (*)))
  	   (extension 100 :type fixnum)
  	   (rummagers (error "rummage array missing")
  		      :type (array %rummager-base (*))))
  
  	 (defstruct (,rummager-type (:include %rummager-base))
  	   (predicate (error "predicate is mandatory to start rummaging")
  		      :type (function (,element-type) boolean))
  	   (bag (error "bag missing") :type ,bag-type)
  	   (parent nil :type (or ,bag-type null)))
  
  	 (defmethod print-object ((object ,bag-type) stream)
  	   (format stream ,(format nil "#<BAG-OF-~s (~~s)>" element-type)
  