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
のbodyの外側にあるのが重要なことに注意。変数が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
を使用して、サブフィーチャの存在をテストできる。そのパッケージがロードされるかどうか、あるいは与えられるバージョンで存在するかどうか不明であるようなあるパッケージ(1つのfeature)において、パッケージの種々の部分やパッケージ機能に命名することでそのパッケージを使いやすくするのが困難なほど複雑なときに使用するというのがサブフィーチャのアイデアである。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がプロバイドされていれば(たとえばfeatureがfeatures
のメンバーなら)t
をリターンする。subfeatureが非nil
なら、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeature
のメンバーのとき)だけt
をリターンする。
この変数の値はシンボルのリストであり、そのシンボルはカレントEmacsセッションにロードされたフィーチャである。シンボルはそれぞれprovide
を呼び出すことにより、このリストにputされたものである。リストfeatures
内の要素の順番に意味はない。