anchor.diff:        "There's no slot binding for variable ~S" var)
       binding))
   
  -(defmacro push-slot-binding (var name address list)
  -  `(pushnew (find-or-set-slot-binding ,var ,name ,address) ,list))
  -
  -(defmacro push-test-bindings (test-form list)
  -  `(loop for obj in (utils:flatten ,test-form)
  -       if (variablep obj)
  -       collect (find-slot-binding obj)))
  -
  -(defmacro push-binding (var list)
  -  `(pushnew (find-slot-binding ,var) ,list))
  +(defun collect-bindings (forms)
  +  (loop for obj in (utils:flatten forms)
  +      if (variablep obj)
  +      collect (find-slot-binding obj)))
   
   (defmacro with-rule-components (((doc-string lhs rhs) rule-form) &body body)
     (let ((remains (gensym)))
  
positive.code: ;;; modify) is performed elsewhere as these constructs undergo additional
  ;;; transformations.
  ;;;
  ;;; $Id: parser.lisp,v 1.9 2002/08/26 01:36:25 youngde Exp $
  
  (in-package "LISA")
  
  
negative.code:     (cl:assert (and (listp form)
                      (= (length form) 1)) nil
        "The body of a TEST CE must be a single Lisp form")
      (values pattern (collect-bindings form))))
  
  (defun parse-default-pattern (pattern location)
    (let ((head (first pattern)))
      (cl:assert (find-meta-fact head nil) nil
        "This pattern has no meta data: ~S" pattern)
      (labels ((push-slot-binding (field slot-name list)
                 (pushnew (find-or-set-slot-binding
                           field slot-name location)
                          list :key #'first))
               (push-constraint-bindings (constraint list)
                 (dolist (obj (utils:flatten constraint))
                   (when (variablep obj)
                     (pushnew (find-slot-binding obj)
                              list :key #'first))))
               (parse-slot (slot)
                 (let ((name (first slot))
                       (field (second slot))
                       (constraint (third slot))
  