anchor.diff:    (defun erase-all-commands ()
       (clrhash command-table)))
   
  -(defmacro defcommand (name &body body)
  +#+nil(defmacro defcommand (name &body body)
     `(add-command ,name
                   (lambda (*bot* *args* *sender* *channel*)
                     (declare (special *bot* *args* *sender* *channel*))
                     (declare (ignorable *args* *bot* *sender* *channel*))
                     ,@body)))
   
  +(defmacro defcommand (name vars regex &body body)
  +  `(add-command ',name
  +                (lambda (*bot* *message* *sender* *channel*)
  +                  (declare (special *bot* *message* *sender* *channel*))
  +                  (declare (ignorable *message* *bot* *sender* *channel*))
  +                  (register-groups-bind ,vars (,regex *message*)
  +                    ,@body))))
  +
   ;;; base commands
   (defcommand "echo"
  -  (send-msg *bot* *channel* *args*))
  +  (send-msg *bot* *channel* *message*))
   (defcommand "ping"
     (send-reply *bot* *sender* *channel* "pong"))
   (defcommand "shut"
  -  (when (scan "up" *args*)
  +  (when (scan "up" *message*)
       (send-reply *bot* *sender* *channel*
                   (format nil "Fine. Be that way. Tell me to talk when you realize ~
                              just how lonely and pathetic you really are."))
  
positive.code:           (set-fact noun (format nil "~A ~A ~A ~A" article noun verb info)))))
  
  (defcommand "fact"
    (send-msg *bot* *channel* (get-fact *args*)))
  
  ;;; URLs
  (deflistener scan-for-url
  
negative.code: ;;; Memos
  (defcommand "memo"
    (destructuring-bind (recipient memo)
        (split "\\s+" *message* :limit 2)
      (progn
        (add-memo recipient memo *sender*)
        (send-msg *bot* *channel*
  