anchor.diff:  (in-package :drei-buffer)
   
   (defclass buffer () ()
  -  (:documentation "A base class for all buffers. A buffer conceptually contains a
  +  (:documentation "The base class for all buffers. A buffer conceptually contains a
   large array of arbitrary objects.  Lines of objects are separated by
   newline characters.  The last object of the buffer is not
   necessarily a newline character."))
  
positive.code:      (setf high-mark (make-instance 'standard-right-sticky-mark :buffer buffer))))
  
  (defgeneric clone-mark (mark &optional stick-to)
    (:documentation "Clone a mark.  By default (when stick-to is NIL)
  the same type of mark is returned.  Otherwise stick-to is either :left
  or :right indicating whether a left-sticky or a right-sticky mark
  should be created."))
  
  (defmethod clone-mark ((mark standard-left-sticky-mark) &optional stick-to)
    (cond ((or (null stick-to) (eq stick-to :left))
  
negative.code:    (low-mark :reader low-mark)
     (high-mark :reader high-mark)
     (modified :initform nil :reader modified-p))
    (:documentation "The standard instantiable class for buffers."))
  
  (defgeneric buffer (mark)
    (:documentation "Return the buffer that the mark is positioned in."))  
  
  (defclass mark () ()
    (:documentation "The base class for all marks."))
  
  (defclass left-sticky-mark (mark) ()
    (:documentation "A subclass of mark.  A mark of this type will
  \"stick\" to the left of an object, i.e. when an object is
  inserted at this mark, the mark will be positioned to the left of
  the object."))
  
  (defclass right-sticky-mark (mark) ()
    (:documentation "A subclass of mark.  A mark of this type will
  \"stick\" to the right of an object, i.e. when an object is
  inserted at this mark, the mark will be positioned to the right
  of the object."))
  
  (defgeneric offset (mark)
    (:documentation "Return the offset of the mark into the buffer."))
  
  (defgeneric (setf offset) (new-offset mark)
    (:documentation "Set the offset of the mark into the buffer.  A
  no-such-offset condition is signaled if the offset is less than
  zero or greater than the size of the buffer."))
  
  (defclass mark-mixin ()
    ((buffer :initarg :buffer :reader buffer)
  