anchor.diff:    "Get `*event*' if it's not nil, or get a fresh empty event."
     (or *event* (event)))
   
  -(defun set-parents (pattern)
  -  "Loop through PATTERN's slots and set the \"parent\" slot of any patterns to this pattern."
  -  (labels ((set-parent (list parent)
  -             "Recurse through LIST, setting the parent of any pattern found to PARENT."
  -             (typecase list
  -               (list
  -                (mapc (lambda (x) (set-parent x parent)) list))
  -               (pattern
  -                (setf (slot-value list 'parent) parent)))))
  -    (dolist (slot (mapcar #'closer-mop:slot-definition-name (closer-mop:class-slots (class-of pattern))) pattern)
  -      (when (and (not (eql slot 'parent))
  -                 (slot-boundp pattern slot))
  -        (set-parent (slot-value pattern slot) pattern)))))
  -
   (defparameter *patterns* (list)
     "List of the names of all defined pattern types.")
   
  -(defmacro defpattern (name superclasses slots &key documentation defun) ;; FIX: should warn if `set-parents' is not called in the creation-function.
  +(defmacro defpattern (name superclasses slots &key documentation defun)
     "Define a pattern. This macro automatically generates the pattern's class, its pstream class, and the function to create an instance of the pattern, and makes them external in the cl-patterns package.
   
   NAME is the name of the pattern. Typically a word or two that describes its function, prefixed with p.
  
positive.code: 
  See also: `pfunc', `p+', `p-', `p*', `p/'"
    :defun (defun pnary (operator &rest patterns)
             (set-parents
              (make-instance 'pnary
                             :operator operator
                             :patterns patterns))))
  
  (defmethod as-pstream ((pnary pnary))
    (with-slots (operator patterns) pnary
  
negative.code:                `(defun ,name ,(function-lambda-list slots)
                    ,documentation
                    ,@(when pre-init (list pre-init))
                    (make-instance ',name
                                   ,@(mapcan (fn (unless (state-slot-p _)
                                                   (list (make-keyword (car _)) (car _))))
                                             slots))))
               (add-doc-to-defun (sexp)
                 (if (and (listp sexp)
                          (position (car sexp) (list 'defun 'defmacro))
  