Next: , Up: ロード   [Contents][Index]


16.1 プログラムがロードを行う方法

Emacs Lispにはロードのためのインターフェイスがいくつかあります。たとえばautoloadはファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(autoloadを参照)。requireはファイルがまだロードされていない場合にファイルをロードします(名前つき機能を参照)。これらすべての関数は処理を行うために最終的にloadを呼び出します。

Function: load filename &optional missing-ok nomessage nosuffix must-suffix

この関数はLispコードのファイルを見つけてオープンして、その中のすべてのフォームを評価してそのファイルをクローズする。

loadはまずファイルを見つけるために、filename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探す。このようなファイルが存在して、かつネイティブコンパイル(Lispからネイティブコードへのコンパイルを参照)のサポートつきでEmacsがコンパイルされていれば、loadは対応する‘.eln’を探して、見つかったらfilename.elcのかわりにそのファイルを、見つからなければfilename.elcをロードする(そして見つからなかった‘.eln’を生成するためにバックグラウンドでネイティブコンパイルを開始してコンパイルしたファイルをロードする)。filename.elcというファイルが存在しなければ、loadfilename.elという名前のファイルを探す。このファイルが存在したらそれをロードする。Emacsがダイナミックモジュール(Emacsのダイナミックモジュールを参照)のサポートつきでコンパイルされていれば、、次にloadfilename.extという名前のファイルを探す。ここでextは共有ライブラリーのシステム依存のファイル名拡張子である(GNUおよびUnixシステムでは‘.so’)。最後に、もしこれらの名前がいずれも見つからなければ、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を使用する。正確なファイル名を指定して、nosuffixtを使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できる。

オプション引数must-suffixが非nilの場合、ロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、loadはファイル名が‘.el’か‘.elc’、または共有ライブラリーの拡張子で終わること(もしかしたら圧縮による拡張子が付加されているかもしれない)を要求する。

オプションload-prefer-newerが非nilなら、loadはサフィックスを検索するとき、どんなファイル(‘.elc’、‘.el’等)であっても、もっとも最近変更されたファイルのバージョンを選択する。この場合には、ネイティブコンパイルされた‘.eln’があっても、loadはそれをロードしない。

filenamefoobaz/foo.barのような相対ファイル名なら、loadは変数load-pathを使用してそのファイルを探す。これはload-path内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかった名前のマッチするファイルをロードする。デフォルトディレクトリーを意味するnilload-pathで措定されたときだけ、カレントデフォルトディレクトリーを試みる。loadload-path内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、...というようにファイルを探す。ライブラリー検索を参照のこと。

最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-nameの値にセットする。

foo.elcfoo.elより古いと警告されたら、それはfoo.elのリコンパイルを考慮すべきことを意味する。バイトコンパイルを参照のこと。

(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにloadは文字セットの変換を行う。コーディングシステムを参照のこと。

コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれるすべてのマクロ(マクロを参照)を展開する。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいる。(関連するコードを実行するまで展開を延期しないで)これを行うことにより、コンパイルされていないコードの実行スピードが明らかに向上する。循環参照によりこのマクロ展開を行うことができないときもある。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合である。Emacsは問題の詳細を与えるために、(‘Eager macro-expansion skipped due to cycle…’)というエラーを報告するだろう。これが起こらないようにするためには、コードのリストラクチャリング(restructuring: 再構築)が必要となる。コンパイル済みのファイルのロードではマクロの展開は行われない(コンパイル時に既に行われているため)。マクロとバイトコンパイルを参照のこと。

nomessageが非nilでなければ、エコーエリアに‘Loading foo...’や‘Loading foo...done’のようなメッセージがロードの間に表示される。ネイティブコンパイルされた‘.eln’ファイルをロードしたら、メッセージでその旨を伝える。

ファイルをロードする間のハンドルされないエラーはロードを終了させる。autoloadのためのロードの場合、ロードの間に定義された任意の関数定義は元に戻される。

loadがロードするファイルを見つけられなかった場合には、通常は(‘Cannot open load file filename’のメッセージとともに) file-errorがシグナルされる。しかしmissing-okが非nilならloadは単にnilをリターンする。

式の読み取りにたいしてloadreadのかわりに使用する関数を指定するために、変数load-read-functionを使用できる。以下を参照されたい。

ファイルが正常にロードされたら、loadtをリターンする。

Command: load-file filename

このコマンドはファイルfilenameをロードする。filenameが相対ファイル名のなら、それはカレントデフォルトディレクトリーを指定したとみなされる。このコマンドはload-pathを使用せず、サフィックスの追加もしない。しかし(Auto Compressionモードが有効なら)圧縮されたバージョンの検索を行う。ロードするファイル名を正確に指定したければ、このコマンドを使用すること。

Command: load-library library

このコマンドはlibraryという名前のライブラリーをロードする。このコマンドは引数を読み取る方法がインタラクティブであることを除きloadと同じ。Lisp Libraries in The GNU Emacs Manualを参照のこと。

Variable: load-in-progress

この変数はEmacsがファイルをロード中なら非nil、それ以外はnilである。

Variable: load-file-name

このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前である。

Variable: load-read-function

この変数はloadeval-regionが式を読み取るために、readのかわりに使用する関数を指定する。指定する関数はreadと同様、引数が1つの関数であること。

デフォルトではこの変数の値はread入力関数を参照のこと。

この変数を使用するかわりに別の新たな方法を使用するほうが明確である。それはeval-regionread-function引数にその関数を渡す方法である。Evalを参照のこと。

Emacsのビルドでloadがどのように使用されているかについての情報は、Emacsのビルドを参照のこと。