次: Unloading, 前: Repeated Loading, 上: Loading
provide
とrequire
は、
ファイルを自動的にロードするためのautoload
の代替手段です。
それらは指定した機能(features)という考え方で動作します。
自動ロードは特定の関数を呼び出すことで起動しますが、
機能はその名前でプログラムが最初に要求したときにロードします。
機能名は、関数や変数などの集合を表すシンボルです。 それらを定義するファイルでは、その機能を提供(provide)します。 それらを使う別のプログラムでは、 その機能を要求(require)することで、 それらが定義されることを確実にします。 こうすると、未ロードであれば定義しているファイルをロードします。
機能を要求するには、機能名を引数にしてrequire
を呼び出します。
require
は、グローバル変数features
を調べて、
目的の機能がすでに提供されているかどうか調べます。
提供されていなければ、適当なファイルから機能をロードします。
このファイルでは、トップレベルでprovide
を呼び出して、
features
に機能を追加するべきです。
そうしないと、require
はエラーを通知します。
たとえば、emacs/lisp/prolog.el には、
つぎのコードのようなrun-prolog
の定義が入っています。
(defun run-prolog () "Run an inferior Prolog process, with I/O via buffer *prolog*." (interactive) (require 'comint) (switch-to-buffer (make-comint "prolog" prolog-program-name)) (inferior-prolog-mode))
(require 'comint)
は、ファイルcomint.elが未ロードであると、
そのファイルをロードします。
これにより、make-comint
が定義済みであることを保証します。
普通、機能には、その機能を提供するファイル名からとった名前を付けますから、
require
にファイル名を指定する必要はありません。
comint.elファイルには、つぎのトップレベルの式が入っています。
(provide 'comint)
これにより、グローバル変数features
のリストに
comint
が追加されるので、
これ以降に(require 'comint)
を実行しても、
なにもしないでよいことになります。
ファイルのトップレベルでrequire
を使うと、
そのファイルをロードする場合と同様に、
そのファイルをバイトコンパイルするとき(see Byte Compilation)にも
require
には効果があります。
要求したパッケージに、
バイトコンパイラが知っている必要があるマクロが入っている場合です。
トップレベルのrequire
の呼び出しは、
バイトコンパイル中に評価されますが、
provide
の呼び出しは評価しません。
したがって、つぎの例のように、
同じ機能に対するprovide
に続けてrequire
を書くことで、
バイトコンパイルするまえに定義のファイルをロードすることを確実にできます。
(provide 'my-feature) ; バイトコンパイラは無視し、
; load
は評価する
(require 'my-feature) ; バイトコンパイラは評価する
コンパイラはprovide
を無視し、
続くrequire
の処理では当該ファイルをロードします。
ファイルのロード時にはprovide
の呼び出しを実行するので、
そのあとのrequire
の呼び出しは、
ファイルをロードするときにはなにもしません。
この関数は、機能featureをロードし終えたこと、あるいは、 ロード中であることを現在のEmacsセッション内で宣言する。 つまり、featureに関連した機能が他のLispプログラムから利用できることを 意味する。
provide
の呼び出しの直接の効果は、 featureがリストfeatures
に入っていなければ、 featureをリストfeatures
の先頭に入れることである。 引数featureはシンボルであること。provide
はfeatureを返す。features => (bar bish) (provide 'foo) => foo features => (foo bar bish)自動ロードによってファイルをロードしているとき、 その内容を評価することでエラーになってロードを中止すると、 ロード中に行われた関数定義や
provide
の呼び出しはもとに戻す。 see Autoload。
この関数は(
(featurep
feature)
を使って) 現在のEmacsセッション内にfeatureが存在するかどうか調べる。 引数featureはシンボルであること。機能が存在していなければ、
require
は、load
を使ってfilenameをロードする。 filenameを指定しないと、シンボルfeatureの名前を ロードすべきファイル名の基にする。 しかしながら、この場合には、require
は、 接尾辞を必ず付加してfeatureを探す。 featureだけの名前のファイルは探さない。featureを提供するファイルのロードに失敗すると、
require
はエラー `Required feature feature was not provided'を通知する。