anchor.diff:          (good (cons r r2) input)))))
   
   (defparserfun not-char (p input)
  -  "Succeed only if P does not match at the current position. Consumes and
  +  "Succeed only if P does not match at the current input. Consumes and
   returns one character when P does not match."
     (unless (funcall p input)
       (multiple-value-bind (c p) (getc input)
  
positive.code: number of times to match. Returns a list of the values returned by P."
    (let ((result nil))
      (loop
         (multiple-value-bind (ok r pos) (funcall p input)
           (cond
             (ok
              (push r result)
              (setf input pos))
             (t
              (return (good (nreverse result) input))))))))
  
  
negative.code: 
  ;;; Runtime functions used by compiled parsers ;;;;;;;;;;;;;;;;;;;;;;;
  
  (defun good (result next-input)
    "Return values indicating a parser succeeded."
    (values t result next-input))
  
  
  ;;;;;; I/O protocol ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  (defgeneric matching-string (s len input)
    (:documentation "Does the string S (with length LEN) match at INPUT?"))
  
  (defgeneric matching-char (c input)
    (:documentation "Does the char C match at INPUT?"))
  
  (defgeneric end-of-text-p (input)
    (:documentation "Are we at the end of the text?"))
  
  (defgeneric getc (input)
    (:documentation "Get the next character and move forward to the next input."))
  
  (defgeneric gettext (input end)
    (:documentation "Get the text between START and END." ))
  
  (defgeneric input-position (input)
    (:documentation "Current position within the input. This is only used for
    informational purposes in tracing output."))
  
  ;;;;;;;;; (cons text position) implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  (defmethod matching-string (s len (input cons))
    (destructuring-bind (text . position) input
  