anchor.diff:                  ,good
                   (return-from ,or (values ,ok ,result ,next-input)))))))))
   
  +(defun new-compile-or (body input names state)
  +  (let ((state-bindings (save-state-bindings state)))
  +    (with-gensyms (ok result next-input restore-state)
  +      (labels ((inner (exprs)
  +                 (if exprs
  +                     `(multiple-value-bind (,ok ,result ,next-input)
  +                          ,(new-compile-form (car exprs) input names state)
  +                        (declare (ignorable ,result))
  +                        (if ,ok
  +                            (values ,ok ,result ,next-input)
  +                            (progn
  +                              (,restore-state)
  +                              ,(inner (rest exprs)))))
  +                     nil)))
  +        `(let (,@state-bindings)
  +           (flet ((,restore-state () ,@(restore-state state-bindings)))
  +             ,(inner body)))))))
  +
   (defun compile-if (body comp)
     (destructuring-bind (test then else) body
       `(if ,test ,(funcall comp then) ,(funcall comp else))))
  
positive.code:                   ,@(restore-state state-bindings)
                    (return-from ,and nil)))))))))
  
  (defun rewrite-and-body (body)
    "Rewrite the list of forms to be compiled into a AND so that a (=> ...) form
  will have its result returned as the result of the AND. If the => form specifies
  
negative.code:            (setf (get ',name 'parser-function) t))
           (defun ,name (,@args ,input)
             ,@(when docstring (list docstring))
             ,(new-compile-and body input (list name) nil))))))
  
  ;;; Compiler ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  