anchor.diff:  
   ;; A compiler macro to reduce dispatching when constructing ropes
   (define-compiler-macro rope (&whole form &rest args)
  -  (with-gensyms (tmp)
  -    (case (length args)
  -      (0 nil)
  -      (1 `(let ((,tmp ,(car args)))
  -            (etypecase ,tmp
  -              (rope ,tmp)
  -              (cons (rope-list-cat ,tmp))
  -              (array (rope-array-cat ,tmp))
  -              (t (object-rope ,tmp)))))
  -      (2 `(%rope ,@args))
  -      (3 `(rope-3 ,@args))
  -      (4 `(rope-4 ,@args))
  -      (5 `(rope-5 ,@args))
  -      (6 `(rope-6 ,@args))
  -      (7 `(rope-7 ,@args))
  -      (8 `(rope-8 ,@args))
  -      (otherwise form))))
  +  (case (length args)
  +    (0 nil)
  +    (1 `(rope-1 ,(car args)))
  +    (2 `(rope-2 ,@args))
  +    (3 `(rope-3 ,@args))
  +    (4 `(rope-4 ,@args))
  +    (5 `(rope-5 ,@args))
  +    (6 `(rope-6 ,@args))
  +    (7 `(rope-7 ,@args))
  +    (8 `(rope-8 ,@args))
  +    (otherwise form)))
   
   (declaim (ftype (function (rope &key (:element-type symbol)) simple-string)
                   rope-string))
  
positive.code:                          '|)|))))
         rope))
  
  (defgeneric object-rope (object))
  
  (defmethod object-rope ((object string))
    object)
  
negative.code:   (left nil :type rope)
    (right nil :type rope))
  
  (declaim (inline object-rope-check))
  (defgeneric object-rope (object))
  
  (defun object-rope-check (object)
    "Call (OBJECT-ROPE OBJECT) and check that result is a rope"
    (let ((result (object-rope object)))
      (check-type result rope)
      result))
  
  
  (declaim (ftype (function (rope) rope-length-type) rope-length))
  (defun rope-length (rope)
    (etypecase rope
  