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

16.11 Emacs 動的モジュール

動的なEmacsモジュールとは、Emacs Lispで記述されたパッケージと同様に、Emacs Lispプログラムで利用するための追加機能を提供する共有ライブラリのことです。

Emacs Lispパッケージを読み込む関数は、動的モジュールも読み込むことができます。これらの関数は、動的モジュールのファイル名の拡張子(いわゆる「サフィックス」)を参照して識別します。このサフィックスはプラットフォームに依存します。

変数: module-file-suffix

この変数には、モジュールファイルのファイル名拡張子のシステム依存の値が格納されます。その値は、POSIXホストでは .so、macOSでは .dylib、MS-Windowsでは .dll となります。

macOSでは、動的モジュールに.dylibに加えて.soというサフィックスを付けることもできます。

すべての動的モジュールは、emacs_module_init という名前の C から呼び出し可能な関数をエクスポートする必要があります。Emacs は、モジュールをロードする load または require の呼び出しの一環として、この関数を呼び出します。また、コードが GPL または互換ライセンスの下で公開されていることを示すため、plugin_is_GPL_compatible という名前のシンボルもエクスポートする必要があります。プログラムがこのようなシンボルをエクスポートしていないモジュールをロードしようとした場合、Emacs はエラーを通知します。

モジュールでEmacsの関数を呼び出す必要がある場合は、Emacsディストリビューションに含まれるヘッダーファイル emacs-module.h で定義・文書化されているAPI(Application Programming Interface)を通じて行う必要があります。独自のモジュールを記述する際にこのAPIを利用する方法の詳細については、動的ロード可能なモジュールの記述を参照してください。

モジュールは、そのモジュールで定義されたC構造体へのポインタを埋め込んだuser-ptr Lispオブジェクトを作成できます。これは、モジュールによって作成された複雑なデータ構造を保持し、モジュールの関数に返す際に有用です。また、ユーザーポインタオブジェクトにはファイナライザ(オブジェクトがGCされる際に実行される関数)を関連付けることもできます。これは、メモリやオープン済みのファイルディスクリプタなど、基盤となるデータ構造に割り当てられたリソースを解放する際に有用です。Lisp値とモジュール値の変換を参照してください。

関数: user-ptrp object

この関数は、引数が user-ptr オブジェクトである場合に t を返します。

関数: module-load file

Emacsは、指定されたfileからモジュールを読み込み、必要な初期化を行うために、この低レベルプリミティブを呼び出します。これは、モジュールがplugin_is_GPL_compatibleシンボルをエクスポートすることを確実にし、モジュールのemacs_module_init関数を呼び出し、その関数がエラー表示を返した場合や、初期化中にユーザーがC-gを入力した場合にエラーを通知するプリミティブです。初期化が成功すると、module-loadはtを返します。なお、loadとは異なり、この関数は既知の拡張子を持つファイルを検索しようとしないため、fileにはあらかじめ適切なファイル名拡張子が付いている必要がある点に注意してください。

loadとは異なり、module-loadはload-historyにモジュールを記録せず、メッセージも出力せず、再帰的なロードに対する保護も行いません。したがって、ほとんどのユーザーはmodule-loadの代わりにload、load-file、load-library、またはrequireを使用すべきです。

Emacsのロード可能なモジュールは、configure時に--with-modulesオプションを指定することで有効になります。