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: 
  (defmacro defrule (name &body parse-form &environment env)
    (assert (= (length parse-form) 1))
    `(defun ,name (string)
       (let ((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)
  
negative.code: 
  (defmethod cpf-list ((car (eql :cl)) form context env)
    "bind a cpf context and invoke any nested call sites"
    ;; should this bind a new context?  skip for now...
    (expand-nested-parse (cdr form) context))
  
  #| original nested method
   (defmethod cpf-list ((car (eql and)) form context)
  