anchor.diff:      :lambda-list ',lambda-list
       ,@(canonize-buzzword-options options)))
   
  +;; This pair just pretties up the options during macro expansion
  +(defun canonize-buzzword-options (options)
  +  (mapappend #'canonize-buzzword-option options))
  +(defun canonize-buzzword-option (option)
  +  (list `',(car option) `',(cadr option)))
  +
  +;; Like defbuzzword. This is just a convenient macro to undefine bws.
   (defmacro undefbuzzword (name &optional (errorp t))
     `(undefine-buzzword
       ',name
       ,errorp))
  +
  +;;; LL analysis
  +(defun check-bw-lambda-list (lambda-list)
  +  (flet ((ensure (arg ok)
  +           (unless ok
  +             (error 'buzzword-lambda-list-error
  +                    :format-control
  +                    "~@<invalid ~S ~_in the generic function lambda list ~S~:>"
  +                    :format-arguments (list arg lambda-list)))))
  +    (multiple-value-bind (required optional restp rest keyp keys allowp
  +				   auxp aux morep more-context more-count)
  +        (parse-lambda-list lambda-list)
  +      (declare (ignore required)) ; since they're no different in a bw ll
  +      (declare (ignore restp rest)) ; since they're no different in a bw ll
  +      (declare (ignore allowp)) ; since &ALLOW-OTHER-KEYS is fine either way
  +      (declare (ignore aux)) ; since we require AUXP=NIL
  +      (declare (ignore more-context more-count)) ; safely ignored unless MOREP
  +      ;; no defaults allowed for &OPTIONAL arguments
  +      (dolist (i optional)
  +        (ensure i (or (symbolp i)
  +                      (and (consp i) (symbolp (car i)) (null (cdr i))))))
  +      ;; no defaults allowed for &KEY arguments
  +      (when keyp
  +        (dolist (i keys)
  +          (ensure i (or (symbolp i)
  +                        (and (consp i)
  +                             (or (symbolp (car i))
  +                                 (and (consp (car i))
  +                                      (symbolp (caar i))
  +                                      (symbolp (cadar i))
  +                                      (null (cddar i))))
  +                             (null (cdr i)))))))
  +      ;; no &AUX allowed
  +      (when auxp
  +        (error "&AUX is not allowed in a generic function lambda list: ~S"
  +               lambda-list))
  +      ;; Oh, *puhlease*... not specifically as per section 3.4.2 of
  +      ;; the ANSI spec, but the CMU CL &MORE extension does not
  +      ;; belong here!
  +      (assert (not morep)))))
   
   (defun analyze-lambda-list (lambda-list)
     (labels ((make-keyword (symbol)
  
positive.code:     (setf (find-buzzword name) buzzword)
      buzzword))
  
  (defun undefine-buzzword (name &optional (errorp nil))
    (let ((buzzword (find-buzzword name errorp)))
      (when buzzword
  
negative.code:       (fmakunbound name)
        buzzword)))
  
  ;; This is the actual buzzword definition macro.
  ;; It first verifies that the lambda-list provided is a valid buzzword ll,
  ;; then expands to a call to ensure-buzzword
  (defmacro defbuzzword (name lambda-list &rest options)
    (declare (type list lambda-list))
    (check-bw-lambda-list lambda-list)
  