Emacs Lisp函数是`require`,因为`autoload`是`load`?

时间:2014-01-06 15:07:48

标签: emacs elisp

我正在尝试对GNU Emacs 23进行编程,以便根据需要懒惰地发出require命令,而不是在我的.emacs文件中预先发出。如果我想延迟执行load命令,我可以使用autoload。但requireload采用不同类型的论点。

是否有require autoload load对{{1}}执行的预定义功能?如果没有,人们会建议我使用哪些工具来推销自己的工具?

3 个答案:

答案 0 :(得分:7)

关于requireloadautoload之间没有区别。 require只是load的前端,或多或少归结为:

(defun require (feature &optional filename noerror)
  (unless (featurep feature)
    (let ((filename (or filename (symbol-name feature))))
      (load filename noerror))))

如您所见,require的符号名称等于load的文件名。事实上,在Emacs会话中评估的第一个(require 'foo)相当于(load "foo")

因此,您可以使用(auto-load 'foo-function "foo") foo-functionfoo库中(require 'foo)加载{{1}}。

答案 1 :(得分:5)

另外一个答案可以帮助澄清(这个评论有点冗长):

  • autoload说“如果此函数尚未定义,则load此文件(如果调用该函数时)。”
  • require说“如果此尚未加载,则load此文件(立即)。”

请特别注意, 需要使用require来加载库;这就是你确保不再加载的方式(假设你不想这样做)。无论库如何加载,都将评估库中的(provide 'FEATURE)表达式,这使得任何未来的require都知道它不需要做任何事情。

autoload的情况类似 - 如果文件已被加载(因此正确定义了相关函数),则自动加载不再有任何效果。

答案 2 :(得分:2)

对于“按需”,您有什么样的“需求”?

  1. 如果给定的命令或其他功能需要(或软需要)给定的库,那么该功能本身可以使用(require 'foo)(require 'foo nil t)。该库将按照该功能的要求加载。

  2. 还要考虑是否需要多次加载文件,即在某些情况下重新加载文件,无论是否已加载。

  3. 对于#2,例如,我使用Lisp宏库的代码icicles-mac.el不只是使用require,因为我想确保如果用户获得该库的新版本(例如,下载新的源版本并对其进行字节编译)然后每当s使用新版本时,它将对另一个需要它的库进行字节编译。 (这很重要 - 当宏库发生更改时,使用这些宏的其他库通常需要在加载新宏文件后重新编译。)为此,我使用此代码而不仅仅是(require 'icicles-mac)

     (eval-when-compile
      (or (condition-case nil
              (load-library "icicles-mac") ; Use load-library to ensure latest .elc.
            (error nil))
          (require 'icicles-mac)))         ; Require, so can load separately if not on `load-path'.