anchor.diff:          (values t s state end)
           (values nil nil state position))))
   
  -(defun compile-parser-function-expression (exp names)
  -  (destructuring-bind (name &rest args) exp
  -    (if args
  -        (with-gensyms (txt s p)
  -          `(lambda (,txt ,s ,p) ,(compile-parser-function-invocation exp names txt s p)))
  -        `(function ,name))))
  -
  -(defun compile-parser-function-invocation (exp names txt s p)
  -  (destructuring-bind (name &rest args) exp
  +(defun compile-match (parser txt s p)
  +  `(funcall ,parser ,txt ,s ,p))
  +
  +(defun compile-parser-call (exp names txt s p)
  +  (destructuring-bind (name &rest args) (rewrite-form exp names)
       (flet ((comp (x) (compile-expression x names)))
         `(,name ,@(mapcar #'comp args) ,txt ,s ,p))))
   
  
positive.code:       (compile-wrapped-form
         #'progn-wrapper
         (first body)
         txt st pos s p names
         (compile-progn (rest body) txt s p names)))))
  
  (defun progn-wrapper (expr ok result s p continuation failure)
    `(multiple-value-bind (,ok ,result ,s ,p) ,expr
  
negative.code:          ,(or continuation `(values t ,result ,s ,p))
           ,failure)))
  
  (defun compile-or (body txt st pos names result)
    "Compile the forms in an OR so that the OR matches if any of the
  elements matches, returning the result from the first match."
    (unless (null body)
  