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: 
  (defparserfun optional (p input)
    "Match P if we can, returning what P did if it succeeded or nil if it failed."
    (multiple-value-bind (ok r pos) (funcall p input)
      (if ok (good r pos) (good nil input))))
  
  (defparserfun try (p input)
    "Attempt to parse using P, moving forward if it succeeds. If P fails, the try
  
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
  