anchor.diff:             (setf (nth ,posgens *tag-dispatchers*) ,valgens)
              (push ,valgens *tag-dispatchers*)))))
   
  +(define-matcher whitespace (find *whitespace*))
   (define-matcher name (or (in #\a #\z) (in #\? #\Z) (in #\- #\:) (is #\\) (is #\_) (is #\!) (is #\#)))
   (define-matcher tag-end (or (and (is #\/) (next (is #\>))) (is #\>)))
   
  
positive.code:          (prog2 (advance)
               (consume-until (make-matcher (any #\" #\')))
             (advance))
           (consume-until (make-matcher (or (is #\Space)
                                            (is #\Tab)
                                            (is #\Newline)
                                            (is #\Linefeed)
                                            (is #\Page)
                                            (is #\Return)
                                            :tag-end)))))))
  
  (defun read-attribute-name ()
    "Reads an attribute name."
    (consume-until (make-matcher (or (is #\=)
                                     (is #\Space)
                                     (is #\Tab)
                                     (is #\Newline)
                                     (is #\Linefeed)
                                     (is #\Page)
                                     (is #\Return)
                                     :tag-end))))
  
  (defun read-attribute ()
    "Reads an attribute and returns it as a key value cons."
  
negative.code:   "Attempts to read a tag and dispatches or defaults to READ-STANDARD-TAG.
  Returns the completed node if one can be read."
    (if (and (char= #\< (consume))
             (funcall (make-matcher :name)))   
        (let ((name (read-name)))
          (loop for (d test func) in *tag-dispatchers*
                when (funcall (the function test) name)
  