anchor.diff:    (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
  
positive.code:                 (rec (rope-list-cat rope)))
                 (array
                  (rec (rope-array-cat rope)))
                 (t (rec (object-rope rope))))))
      (rec rope)))
  
  (declaim (ftype (function (t t) rope) %rope))
  (defun %rope (first second)
    "Construct a rope from FIRST and SECOND.
  FIRST: an object of rope or sequence type
  
negative.code:   (declare (dynamic-extent args))
    (when args (rope-list-cat args)))
  
  (declaim (ftype (function (t) rope) rope-1))
  (defun rope-1 (rope)
    (etypecase rope
      (rope rope)
      (list
       (rope-list-cat rope))
      (array
       (rope-array-cat rope))
      (t (object-rope-check rope))))
  
  
  (declaim (inline rope-2))
  (defun rope-2 (a1 a2)
    (%rope a1 a2))
  
  (defun rope-3 (a1 a2 a3)
    (%rope a1
           (%rope a2 a3)))
  
  (defun rope-4 (a1 a2 a3 a4)
    (%rope (%rope a1 a2)
           (%rope a3 a4)))
  