GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/How-Programs-Do-Loading.html ・ emacs-doc.conao3.com

16.1 プログラムの読み込み方法

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

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

この関数は、Lispコードのファイルを探して開き、その中のすべてのフォームを評価し、ファイルを閉じます。

ファイルを探す際、loadはまずfilename.elcという名前のファイル、すなわち名前がfilenameで拡張子‘.elc’が付加されたファイルを探します。そのようなファイルが存在し、かつEmacsがネイティブコンパイル対応でコンパイルされていた場合(Lispのネイティブコードへのコンパイルを参照)、loadは対応する‘.eln’ファイルを探そうとし、見つかった場合はfilename.elcの代わりにそれをロードします。そうでない場合は、filename.elcをロードします(そして、不足している‘.eln’ファイルを生成するためにバックグラウンドでネイティブコンパイルを開始し、その後そのファイルをロードします)。filename.elcが存在しない場合、loadはfilename.elという名前のファイルを探します。そのファイルが存在すれば、それがロードされます。Emacsが動的モジュール対応でコンパイルされていた場合(Emacsの動的モジュールを参照)、loadは次にfilename.extという名前のファイルを探します。ここでextは、共有ライブラリのシステム依存のファイル名拡張子(GNUおよびUnixシステムでは‘.so’)です。最後に、いずれの名前も見つからなかった場合、loadは何も付加されていないfilenameという名前のファイルを探し、存在すればそれをロードします。(load関数は、filenameを探すという点において巧妙ではありません。foo.el.elという名前のファイルがあるという奇妙なケースでは、(load "foo.el")の評価によって実際にそのファイルが見つかります。)

デフォルトで有効になっている「自動圧縮」モードが有効な場合、load でファイルが見つからないときは、他のファイル名を試す前に、そのファイルの圧縮版を検索します。圧縮版が存在する場合は、それを解凍して読み込みます。圧縮版の検索は、ファイル名に jka-compr-load-suffixes に含まれる各サフィックスを付加することで行われます。この変数の値は文字列のリストである必要があります。標準値は (".gz") です。

オプション引数 nosuffix が nil 以外の場合、load は接尾辞 ‘.elc’ および ‘.el’ を試しません。この場合、指定したい正確なファイル名を明記する必要があります。ただし、自動圧縮モードが有効な場合は、load は引き続き jka-compr-load-suffixes を使用して圧縮版を検索します。正確なファイル名を指定し、nosuffix に t を使用することで、foo.el.el のようなファイル名が試行されるのを防ぐことができます。

オプション引数 must-suffix が nil 以外の場合、load は、明示的なディレクトリ名が含まれていない限り、使用するファイル名が ‘.el’ または ‘.elc’(圧縮サフィックスが付加される場合がある)、あるいは共有ライブラリ拡張子のいずれかで終わらなければならないことを規定します。

オプション load-prefer-newer が nil 以外の場合、サフィックスを検索する際、load はファイルのどのバージョン(‘.elc’、‘.el’ など)が最も最近変更されたかを選択します。この場合、load は ‘.eln’ ネイティブコンパイル済みファイルが存在していても、それを読み込みません。

filename が foo や baz/foo.bar のような相対ファイル名である場合、load は変数 load-path を用いてファイルを検索します。load-path に列挙された各ディレクトリに filename を付加し、名前が一致する最初に見つかったファイルを読み込みます。現在のデフォルトディレクトリは、load-path で指定されている場合にのみ試行されます。ここで nil はデフォルトディレクトリを表します。load は、load-path の最初のディレクトリで考えられる3つのサフィックスをすべて試し、次に2番目のディレクトリで同様に3つのサフィックスをすべて試す、という手順を繰り返します。ライブラリ検索 を参照してください。

最終的にそのファイルが見つかったファイル名が何であれ、またEmacsがそれを発見したディレクトリがどこであれ、Emacsは変数load-file-nameの値にそのファイル名を設定します。

foo.elc が foo.el より古いという警告が表示された場合は、foo.el の再コンパイルを検討してください。バイトコンパイルを参照してください。

ソースファイル(コンパイルされていないもの)を読み込む際、load は Emacs がそのファイルを開くときと同様に文字セット変換を行います。コーディングシステムを参照してください。

未コンパイルのファイルを読み込む際、Emacsはそのファイルに含まれるマクロを展開しようとします(マクロを参照)。これを早期マクロ展開と呼びます。(関連するコードが実行されるまで展開を遅らせるのではなく)このように行うことで、未コンパイルコードの実行速度を大幅に向上させることができます。場合によっては、循環依存関係のためにこのマクロ展開が行えないことがあります。最も単純な例では、読み込んでいるファイルが別のファイルで定義されたマクロを参照しており、さらにその別のファイルが読み込んでいるファイルを必要としているという状況です。Emacsは(‘Eager macro-expansion skipped due to cycle…’)に関するエラーを発生させ、問題の詳細を表示します。このような事態が起きないよう、コードを再構成する必要があります。コンパイル済みファイルの読み込みではマクロ展開は行われません。これは、コンパイル時にすでに展開されているはずだからです。マクロとバイトコンパイルを参照してください。

nomessage が non-nil でない限り、読み込み中にエコー領域に ‘Loading foo...’ や ‘Loading foo...done’ といったメッセージが表示されます。ネイティブコンパイルされた ‘.eln’ ファイルが読み込まれた場合は、その旨がメッセージに表示されます。

ファイルの読み込み中に未処理のエラーが発生すると、読み込みは中断されます。autoload を目的として読み込みが行われた場合、読み込み中に行われた関数定義はすべて取り消されます。

load がロードするファイルを見つけられない場合、通常は file-error(‘Cannot open load file filename’ を伴う)を通知します。ただし、missing-ok が non-nil である場合、load は単に nil を返します。

変数 load-read-function を使用すると、式の読み込み時に read の代わりに load が使用する関数を指定できます。以下を参照してください。

load は、ファイルが正常に読み込まれた場合に t を返します。

コマンド: load-file filename

このコマンドはファイル filename を読み込みます。filename が相対ファイル名である場合は、現在のデフォルトディレクトリが想定されます。このコマンドは load-path を使用せず、サフィックスも付加しません。ただし、圧縮版の有無は確認します(自動圧縮モードが有効な場合)。読み込むファイル名を正確に指定したい場合は、このコマンドを使用してください。

コマンド: load-library library

このコマンドは、library という名前のライブラリをロードします。引数を対話的に読み取る点を除けば、load と同等です。The GNU Emacs Manual の Lisp Libraries を参照してください。

変数: load-in-progress

この変数は、Emacsがファイルの読み込み処理中であれば非nilとなり、それ以外の場合はnilとなります。

変数: load-file-name

Emacsがファイルを読み込んでいる際、この変数の値は、本節で前述した検索過程でEmacsが検出したそのファイルの名前となります。

変数: load-read-function

この変数は、load および eval-region が read の代わりに使用する代替の式読み込み関数を指定します。この関数は、read と同様に、1つの引数を受け取る必要があります。

デフォルトでは、この変数の値は read です。入力関数を参照してください。

この変数を使う代わりに、別のより新しい機能、すなわち関数をread-functionの引数としてeval-regionに渡す方法を用いる方が簡潔です。Evalを参照してください。

関数: load-path-filter-cache-directory-files path filename suffixes

この関数は path をフィルタリングし、suffixes のいずれかと共に filename を保持できなかったディレクトリをすべて除外して、フィルタリング後のディレクトリ一覧を返します。また、スキャンしたディレクトリとその中のファイルをキャッシュし、後続の呼び出しでそのキャッシュを利用することで、path 内のファイルに対する繰り返しのルックアップを高速化します。

変数: load-path-filter-function

この変数が関数名である場合、load はファイル検索のために load-path をスキャンする際にその関数を呼び出します。関数には3つの引数が渡されます。load-path の値、filename、load に渡される検索対象のファイル名、および filename に付加するサフィックスのリストです。この関数は、filename が配置され得るディレクトリのより短いリストを返すことで、検索を高速化させる必要があります。関数 load-path-filter-cache-directory-files は、このような関数の候補として適しています。

Emacsのビルドにおけるloadの使用方法については、Building Emacsを参照してください。