Next: Where Defined, Previous: Repeated Loading, Up: Loading [Contents][Index]
provideとrequireは、autoloadにかわるファイルを自動的にロードする関数です。これらは名前付きのフィーチャ(feature:
機能)という面で機能します。オートロードは特定の関数の呼び出しをトリガーにしますが、フィーチャーは最初は他のプログラムが名前により問い合わせたときにロードされます。
フィーチャ名とは、関数、変数などのコレクションを表すシンボルです。これらを定義するファイルは、そのフィーチャをプロバイド(provide: 提供)すべきです。これらのフィーチャを使用する他のプログラムは、その機能をリクワイア(require: 要求)することにより、それらが定義されているか確認できるでしょう。これは、定義がまだロードされていなければ、定義ファイルをロードします。
フィーチャをリクワイアするには、フィーチャ名を引数としてrequireを呼び出します。requireは、意図する機能がすでにプロバイドされているか確認するために、グローバル変数featuresを調べます。もしプロバイドされていなければ、適切なファイルからそのフィーチャをロードします。このファイルは、そのフィーチャをfeaturesに追加するために、トップレベルでprovideを呼び出すべきです。これに失敗すると、requireはエラーをシグナルします。
たとえば、idlwave.el内のidlwave-complete-filenameにたいする定義には、以下のコードが含まれます:
(defun idlwave-complete-filename ()
"Use the comint stuff to complete a file name."
(require 'comint)
(let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
(comint-completion-addsuffix nil)
...)
(comint-dynamic-complete-filename)))
式(require
'comint)は、comint.elがまだロードされていなければ、comint-dynamic-complete-filenameが確実に定義されるように、そのファイルをロードします。フィーチャは通常、それらを提供するファイルにしたがって命名されるため、requireにファイル名を与える必要はありません。(require命令文がletのボディーの外側にあるのが重要なことに注意してください。変数がletバインドされているライブラリーをロードすることにより、意図せぬ結果、つまりletをexitした後にその変数がアンバインドされます。)
comint.elには以下のトップレベル式が含まれます:
(provide 'comint)
これはcomintはグローバルなリストfeaturesに追加するので、(require
'comint)は今後何も行う必要がないことを知ることができます。
ファイルのトップレベルrequireが使用されたときは、それをロードしたときと同様、そのファイルをバイトコンパイル(Byte Compilationを参照)したときにも効果が表れます。これはリクワイアされたパッケージがマクロを含み、バイトコンパイラーがそれを知らなければならない場合です。これはrequireによりロードされるファイルで定義される関数と変数にたいするバイトコンパイラーの警告も無効にします。
バイトコンパイルの間にトップレベルのrequireが評価されるとしても、provide呼び出しは評価されません。したがって、以下の例のようにprovideの後に同じ機能にたいするrequireを含めることにより、バイトコンパイル前に定義しているファイルを確実にロードできます。
(provide 'my-feature) ; バイトコンパイラーには無視され、
; loadには評価される。
(require 'my-feature) ; バイトコンパイラーにより評価される。
コンパイラーはprovideを無視して、その後に対象のファイルをロードすることによりrequireが処理されます。ファイルのロードはprovide呼び出しを実行するので、後続のrequireはファイルがロードされているときは何も行いません。
この関数は、カレントEmacsセッションにfeatureがロードされた、あるいはロードされつつあることをアナウンスします。これは、featureに関連する機能が他のLispプログラムから利用可能できる、あるいは利用可能になることを意味します。
provideを呼び出すことによる直接的な効果は、まだfeatureがfeatures内に存在しない場合はリストの先頭に追加して、それを必要としているeval-after-loadコードを呼び出します(Hooks for Loadingを参照)。引数featureはシンボルでなければなりません。provideはfeatureをリターンします。
subfeaturesが与えられた場合、それはfeatureの当該バージョンによりプロバイドされる特定のサブフィーチャのセットを示すシンボルのリストであるべきです。featurepを使用して、サブフィーチャの存在をテストできます。あるパッケージの、ロードされるか、あるいはそのバージョンに存在するか不明なさまざまな部分や機能に名前を与えて使いやすくするには、そのパッケージが複雑すぎるときにサブフィーチャを使用するというのがサブフィーチャというアイデアです。例としては、Network Feature Testingを参照してください。
features
⇒ (bar bish)
(provide 'foo)
⇒ foo
features
⇒ (foo bar bish)
オートロードによりあるファイルがロードされて、その内容の評価エラーによりストップいたとき、そのロードの間に発生した関数定義やprovide呼び出しはアンドゥされます。Autoloadを参照してください。
この関数はカレントEmacsセッションにおいて、featureが存在するかどうかを、((featurep
feature)を使用して。以下を参照)をチェックします。引数featureはシンボルでなければなりません。
そのフィーチャが存在しない場合、requireはloadによりfilenameをロードします。filenameが与えられなかった場合は、シンボルfeatureの名前がロードするファイル名のベースとして使用されます。しかしこの場合、requireはfeatureを探すためにサフィックス‘.el’および‘.elc’の追加を強制します(圧縮ファイルのサフィックスに拡張されるかもしれません)。名前がただのfeatureというファイルは使用されません。(変数load-suffixesは要求されるLispサフィックスを正確に指定します。)
noerrorが非nilの場合は、ファイルの実際のロードにおけるエラーを抑止します。この場合、そのファイルのロードが失敗すると、requireはnilをリターンします。通常では、requireはfeatureをリターンします。
ファイルのロードは成功したがfeatureをプロバイドしていない場合、requireは‘Required
feature feature was not provided’のようにエラーをシグナルします。
この関数は、カレントEmacsセッションfeatureがプロバイドされている場合(たとえばfeaturefeaturesのメンバーの場合)はtをリターンします。subfeatureが非nilの場合、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeatureのメンバーのとき)だけtをリターンします。
この変数の値はシンボルのリストで、このシンボルはカレントEmacsセッションにロードされたフィーチャです。シンボルはそれぞれprovideを呼び出すことにより、このリストにputされたものです。リストfeatures内の要素の順番に意味はありません。