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


16.11 Emacsのダイナミックモジュール

ダイナミックEmacsモジュール(dynamic Emacs module: 動的Emacsモジュール)とは、Emacs Lispで記述されたパッケージのように、Emacs Lispプログラムで使用するための追加機能を提供する共有ライブラリーです。

Emacs Lispパッケージをロードする関数は、ダイナミックモジュールのロードもできます。これらの関数はファイル名の拡張子、いわゆる“サフィックス”を調べることによってダイナミックモジュールを認識します。

Variable: module-file-suffix

この変数はモジュールファイルにたいするシステム依存なファイル名拡張子を保持する。POSIXホストでは.so、macOSでは.dylib 、MS-Windowsでは.dll

macOSではダイナミックモジュールは.dylibに加えて、サフィックス.soをもつこともできます。

すべてのダイナミックモジュールはemacs_module_initという名前のCから呼び出し可能な関数をエクスポートする必要があります。Emacsはそのモジュールをロードするloadrequireの呼び出しの一部として、その関数を呼び出します。自身のコードがGPLまたは互換ライセンスの下にリリースされていることを示すために、plugin_is_GPL_compatibleという名前のシンボルもエクスポートするべきです。このようなシンボルをエクスポートしないモジュールをプログラムがロードしようとすると、Emacsはエラーをシグナルするでしょう。

あるモジュールがEmacsの関数の呼び出しを必要とするなら、Emacsディストリビューションに同梱されているヘッダーファイルemacs-module.hで定義および文書化されたAPI (Application Programming Interface)を介して行う必要があります。独自モジュールを記述する際におけるこのAPI使用の詳細は動的にロードされるモジュールの記述を参照してください。

モジュールはモジュールが定義するC構造体への埋め込みポインターとなるLispオブジェクトuser-ptrを作成できます。これはモジュールが作成する複雑なデータ構造を維持してモジュールの関数に渡して戻す場合に有用です。user-ptrオブジェクトはそれに関連付けられるファイナライザー(finalizer: オブジェクトがガーベージコレクトされる際に呼び出される関数)をもつこともできます。これはメモリー、オープンしたファイル記述子等のデータ構造の背後に割り当てられたリソースの解放に有用です。Lisp・モジュール間の値変換を参照してください。

Function: user-ptrp object

この関数は引数がuser-ptrオブジェクトならtをリターンする。

Function: module-load file

Emacsは指定されたfileからモジュールをロードして、そのモジュールに必要な初期化えを行うために、この低レベルのプリミティブを呼び出す。これはモジュールがシンボルplugin_is_GPL_compatibleをエクスポートすることを保証して、モジュールのemacs_module_init関数を呼び出し、その関数のリターン値がエラーを示したりユーザーが初期化中にC-gをタイプしたらエラーをシグナルする。初期化が成功するとmodule-loadtをリターンする。この関数はloadとは異なり既知の拡張子をもつファイルの検索を試みないので、fileは正確なファイル名拡張子をもたなければならないことに注意。

loadとは異なり、module-loadload-historyにモジュールを記録せず、何もメッセージをプリントしないし、再帰ロードにたいする保護も行わない。したがってほとんどのユーザーはmodule-loadのかわりにloadload-fileload-libraryrequireを使用するべきである。

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