anchor.diff:             :run-tests
              :run-koans
              :use-debugger)
  -  ;; Functions for managing tags
  -  (:export :list-tags
  -           :tagged-tests
  -           :remove-tags
  -           :run-tags)
     ;; Constants for blanks in koans
     (:export __
              ___
  
positive.code:     (setf (gethash package *test-db*) (make-hash-table)))
     (t (warn "No tests defined for package: ~S" package))))
  
  ;;; Global tags database
  
  (defparameter *tag-db* (make-hash-table :test #'eq)
    "The tag database is simply a hash table.")
  
  (defun package-tags (package &optional create)
    "Return the tags DB for the package."
    (cond
     ((gethash (find-package package) *tag-db*))
     (create
      (setf (gethash package *tag-db*) (make-hash-table)))
     (t (warn "No tags defined for package: ~S" package))))
  
  (defclass unit-test ()
    ((doc
      :type string
  
negative.code:    "Organize the unit test documentation and code."))
  
  ;;; NOTE: Shamelessly taken from PG's analyze-body
  (defun parse-body (body &optional doc)
    "Separate the components of the body."
    (let ((item (first body)))
      (if (and (stringp item) (not doc) (rest body))
          (parse-body (rest body) doc)
          (values doc body))))
  
  (defmacro define-test (name &body body)
    "Store the test in the test database."
    (multiple-value-bind (doc code) (parse-body body)
      `(let ((doc (or ,doc (string ',name))))
         (setf
          ;; Unit test
          (gethash ',name (package-table *package* t))
          (make-instance 'unit-test :doc doc :code ',code))
         ;; Return the name of the test
         ',name)))
  
  