anchor.diff:         (or "c" "d")))
   
   
  -(defmethod cpf-list ((car (eql 'repeat)) form context)
  +(defmethod cpf-list ((car (eql 'repeat)) form context env)
     "(repeat min max form) where min is 0 or more and max is an integer or nil for unlimited"
     (with-slots (string start end) context
       (destructuring-bind (min max body) (cdr form)
  
positive.code:                     `(not ,e))
                 (when (>= ,c ,min)
                   (values ,le (reverse ,v))))
              (setf (values ,e ,tmp) ,(cpf body new-context))
              (when ,e
                (incf ,c)
                (setf ,le ,e)
  
negative.code: 
  (defmacro defrule (name &body parse-form &environment env)
    (assert (= (length parse-form) 1))
    `(defun ,name (string &optional (start 0) (end (length string)))
         ,(cpf (car parse-form) (make-instance 'string-context :string 'string :start 'start :end 'end) env)))
  
  ;; work on a protocol for defrule, allowing compile-time dispatch
  (defvar *parse-rules* (make-hash-table)
  