anchor.diff:  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   (in-package :sheeple)
   
  +;; We currently use structs for storage, since they're more convenient atm.
   (defstruct (buzzword (:constructor %make-buzzword))
     (name nil)
     (lambda-list nil)
     (messages nil)
  +  ;; This contains an arg-info object that is used to maintain
  +  ;; lambda-list congruence.
     (arg-info (make-arg-info))
     (documentation ""))
   
  
positive.code: ;;;
  
  ;;; Buzzword table
  (let ((buzzword-table (make-hash-table :test #'equal)))
  
    (defun find-buzzword (name &optional (errorp t))
  
negative.code:     :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)
  