anchor.diff:                    ((parser-call-p form names)  (compile-parser-call (mklist form) input names state))
                     ((stringp form)              (compile-string form input))
                     ((characterp form)           (compile-character form input))
  -                  (t                           `(values t ,form (copy-input ,input))))
  +
  +                  ;; N.B. we copy-input here to ensure that lisp forms do not
  +                  ;; have their state rewound.
  +                  (t `(values t ,form (copy-input ,input))))
                (when (or (eql ,next-input ,input) (not ,ok))
                  ,@(restore-state state-bindings))
                (when ,ok
  
positive.code: 
  (defun form-p (what form)
    (and (consp form) (eql (car form) what)))
  
  
  ;;; I/O protocol ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  
negative.code:   "Compile a call to a parser function. Arguments are evaluated slightly
  differently than forms appearing as grammar expressions: grammar expressions are
  turned into a thunk so the parser function can invoke them as needed while IF
  and TRACE forms have their parts compiled with this function. All other values
  are passed through as plain Lisp values."
    (destructuring-bind (name &rest args) exp
      (labels ((compile-arg (form)
                 (cond
  