anchor.diff:             (defun ,name ,arglist
                ,@(sera:unsplice documentation)
                ,@declares
  +             ,pre-form
                (handler-case
                    (progn
                      (hooks:run-hook ,before-hook)
  
positive.code:   "Define NAME, a deprecated command.
  This is just like a command.  It's recommended to explain why the function is
  deprecated and by what in the docstring."
    (multiple-value-bind (forms declarations documentation)
        (alex:parse-body body :documentation t)
  
      (unless documentation
        (warn (make-condition
               'command-documentation-style-warning
               :name name)))
      `(progn
         (define-command ,name ,arglist
           ,@(sera:unsplice documentation)
           ,@declarations
           (progn
             ;; TODO: Implement `warn'.
             (echo-warning "~a is deprecated." ',name)
             ,@forms)))))
  
  (defun nyxt-packages ()                 ; TODO: Export a customizable *nyxt-packages* instead?
    "Return all package designators that start with 'nyxt' plus Nyxt own libraries."
  
negative.code: This means it will be listed in `command-source' when the global option is on.
  This is mostly useful for third-party packages to define globally-accessible
  commands without polluting Nyxt packages."
    `(%define-command ,name (:global-p t) (,@arglist) ,@body))
  
  ;; TODO: Should `define-deprecated-command' report the version number of deprecation?
  ;; Maybe OK to just remove all deprecated commands on major releases.
  