anchor.diff:            (t (error "Name must be SYMBOL or LIST.")))
         `(:name ,name :args ,extra-args :body ,body))))
   
  -(defun production-names (p)
  -  "The names of the productions defined in the parser."
  -  (mapcar #'(lambda (x) (getf x :name)) (mapcar #'production (cdddr p))))
  -
   (defun grammar-p (name names)
     (or (member name names) (get name 'parser-function)))
  -
  -(defun compile-production (p names)
  -  (destructuring-bind (&key name args body) p
  -    `(:name ,name :function (lambda (,@args text state position) ,(compile-progn body 'text 'state 'position names)))))
   
   (defun compile-progn (body txt st pos names)
     (unless (null body)
  
positive.code:   (loop with r = nil
       while t do
         (multiple-value-bind (ok result new-state new-position)
             (call-parser p text state position)
           (cond
             (ok
              (push r result)
  
negative.code: (defparserfun try (p text state position)
    "Attempt to parse using p, moving forward if it succeeds. However if
  it fails, it does not consume any input."
    (multiple-value-bind (ok r ns np) (funcall p text state position)
      (if ok
          (values t r ns np)
          (values nil nil state position))))
  