Next: Load Suffixes, Up: Loading [Contents][Index]
Emacs
Lispにはロードのためのインターフェイスがいくつかあります。たとえば、autoload
はファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(Autoloadを参照)。require
は、ファイルがまだロードされていない場合にファイルをロードします(Named Featuresを参照)。これらすべての関数は、処理を行うために最終的にload
を呼び出します。
この関数はLispコードのファイルを見つけてオープンし、その中のすべてのフォームを評価して、そのファイルをクローズします。
ファイルを見つけるために、まずload
はfilename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探します。このようなファイルが存在したら、それをロードします。その名前のファイルが存在しない場合、load
はfilename.elという名前のファイルを探します。このファイルが存在したら、それをロードします。最後に、もしこれらの名前がどちらも見つからなかった場合、load
は何も付け足さないfilenameという名前のファイルを探して、それが存在したらロードします。(load
関数にfilenameを認識する賢さはありません。foo.el.elのような正しくない名前のファイルの場合も、(load
"foo.el")
の評価によりそれを見つけてしまいます。)
Auto
Compressionモードが有効(残念ながらデフォルトでは有効ですが)の場合、load
は他のファイル名を試みる前に圧縮されたバージョンのファイル名を探すので、ファイルを見つけることができません。圧縮されたファイルが存在したら、それを解凍してロードします。load
はファイル名にjka-compr-load-suffixes
内の各サフィックスを足して、圧縮されたバージョンを探します。この変数の値は、文字列のリストでなければなりません。標準的な値は(".gz")
です。
オプション引数nosuffixが非nil
の場合load
はサフィックス‘.elc’と‘.el’を試みません。この場合、ロードしたいファイルの正確な名前を指定しなければなりません。ただしAuto
Compressionモードが有効な場合には、load
は圧縮されたバージョンを探すために、jka-compr-load-suffixes
を使用します。正確なファイル名の指定と、、nosuffixにたいしてt
を使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できます。
オプション引数must-suffixが非nil
の場合、load
はロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、ファイル名が‘.el’か‘.elc’で終わること(あるいは圧縮による拡張子が付加されているかもしれません)を要求します。
オプションload-prefer-newer
が非nil
の場合、load
はサフィックスを検索するとき、どのファイルであっても(‘.elc’、‘.el’など)、もっとも最近変更されたファイルのバージョンを選択します。
filenameがfooやbaz/foo.barのような相対ファイル名の場合、load
は変数load-path
を使用してそのファイルを探します。これはload-path
内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかったら名前のマッチするファイルをロードします。デフォルトディレクトリーを意味するnil
がload-path
で措定されたときだけ、カレントデフォルトディレクトリーを試みます。load
はload-path
内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、というようにファイルを探します。Library Searchを参照してください。
最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-name
の値にセットします。
foo.elcがfoo.elより古いと警告された場合、それはfoo.elのリコンパイルを考慮すべきことを意味します。Byte Compilationを参照してください
(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにload
は文字セットの変換を行います。Coding Systemsを参照してください。
コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれる任意のマクロ(Macrosを参照)を展開します。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいます。(関連するコードを実行するまで展開を延期するのではなく)これを行うことにより、コンパイルされていないコード実行のスピードが明らかに向上します。このマクロ展開は、循環参照により行うことができないときもあります。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合です。これは一般的には無害です。Emacsは問題の詳細を与えるために警告(‘Eager macro-expansion skipped due to cycle…’)をプリントしますが、単にその時点ではマクロを展開せずに、そのファイルはロードされます。あなたはこの問題が発生しないように、コードをリストラクチャーしたいと思うかもしれません。コンパイル済みファイルでは、マクロ展開はコンパイル時に行われるので、ロード時のマクロ展開は行われません。Compiling Macrosを参照してください。
nomessageが非nil
でない場合は、ロードの間、エコーエリアに‘Loading
foo...’や‘Loading foo...done’のようなメッセージが表示されます。
ファイルをロードする間のハンドルされないエラーは、ロードを終了させます。autoload
のためのロードの場合、ロードの間に定義された任意の関数定義は元に戻されます。
load
がロードするファイルを見つけられなかった場合、通常は(‘Cannot open load file
filename’のメッセージとともに)エラーfile-error
がシグナルされます。しかしmissing-okが非nil
の場合、load
は単にnil
をリターンします。
式の読み取りにたいしてload
がread
のかわりに使用する関数を指定するために、変数load-read-function
を使用できます。以下を参照してください。
ファイルが正常にロードされた場合、load
はt
をリターンします。
このコマンドは、ファイルfilenameをロードします。filenameが相対ファイル名の場合は、カレントデフォルトディレクトリーとみなされます。このコマンドは、load-path
を使用せず、サフィックスの追加もしません。しかし、(Auto
Compressionモードが有効な場合は)圧縮されたバージョンの検索を行います。ロードするファイル名を正確に指定したい場合は、このコマンドを使用してください。
このコマンドはlibraryという名前のライブラリーをロードします。このコマンドは、引数を読み取る方法がインタラクティブであることを除き、load
と同じです。Lisp
Libraries in The GNU Emacs Manualを参照してください。
この変数は、Emacsがファイルをロード中のときは非nil
、それ以外はnil
です。
このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前です。
この変数は、load
とeval-region
が式の読み取るために、read
のかわりに使用する関数を指定します。指定する関数はread
と同様、引数が1つの関数です。
通常、この変数の値はnil
で、これはそれらの関数がread
を使用すべきことを意味します。
この変数を使用するかわりに、別の新たな方法を使用するほうが明確です。eval-region
のread-function引数に、その関数を渡す方法です。Evalを参照してください。
Emacsのビルドでload
がどのように使用されているかについての情報は、Building Emacsを参照してください。