anchor.diff:             (setf (get ',name 'parser-function) t))
            (defun ,name (,@args ,input)
              ,@(when docstring (list docstring))
  -           ,(compile-and body input (list name) nil))))))
  +           ,(new-compile-and body input (list name) nil))))))
   
   ;;; Compiler ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
  
positive.code:                 ,good
                  (return-from ,or (values ,ok ,result ,next-input)))))))))
  
  (defun compile-if (body comp)
    (destructuring-bind (test then else) body
      `(if ,test ,(funcall comp then) ,(funcall comp else))))
  
negative.code: binding."
    (with-gensyms (input)
      (destructuring-bind ((name &rest args) &rest body) p
        `(,name (,@args ,input) ,(new-compile-and body input names state)))))
  
  (defun compile-form (form input names state)
    "Compile a single parser form as it would appear in an AND or OR."
    (labels ((self (x) (compile-form x input names state)))
      (cond
        ((form-p 'and form)          (new-compile-and (rest form) input names state))
        ((form-p 'or form)           (new-compile-or (rest form) input names state))
        ((form-p 'if form)           (compile-if (cdr form) #'self))
        ((form-p 'match form)        (compile-match (cadr form) input))
        ((form-p 'trace form)        (compile-trace form #'self))
  