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
内の要素の順番に意味はありません。