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

E.7.4 モジュール向けの各種便利関数

本サブセクションでは、モジュール API が提供するいくつかの便利な関数について説明します。前のサブセクションで説明した関数と同様に、これらはすべて実際には関数ポインタであり、emacs_env ポインタを介して呼び出す必要があります。Emacs 25 以降に導入された関数については、利用可能になった最初のバージョンを明記しています。

関数: bool eq (emacs_env *env, emacs_value a, emacs_value b)

この関数は、a と b が表す Lisp オブジェクトが同一であれば true を、そうでなければ false を返します。これは Lisp 関数 eq(等価述語 を参照)と同等ですが、引数が表すオブジェクトをインターニングする必要がありません。

その他の等価判定子に対応するAPI関数は用意されていないため、より複雑な等価判定を行うには、後述するinternおよびfuncallを使用する必要があります。

関数: bool is_not_nil (emacs_env *env, emacs_value arg)

この関数は、arg で表される Lisp オブジェクトが non-nil であるかどうかを判定し、それに応じて true または false を返します。

なお、intern を用いて nil を表す emacs_value を取得し、前述の eq を使って等価性を判定するという方法でも、同等のテストを実装できます。しかし、この関数を使用する方が便利です。

関数: emacs_value type_of (emacs_env *env, emacs_value arg)

この関数は、arg の型をシンボルを表す値として返します。文字列の場合は string、整数の場合は integer、プロセスの場合は process となります。詳細は 型述語 を参照してください。コード内でオブジェクトの型に依存する必要がある場合は、intern や eq を使用して既知の型シンボルと比較できます。

関数: emacs_value intern (emacs_env *env, const char *name)

この関数は、名前が name である内部化された Emacs シンボルを返します。この名前は ASCII のヌル終端文字列である必要があります。シンボルが存在しない場合は、新規に作成します。

後述するfuncallと併せて、この関数は、名称が純粋なASCII文字列である限り、Lispから呼び出し可能な任意のEmacs関数を呼び出す手段を提供します。例えば、名称name_strが非ASCIIであるシンボルを、より強力なEmacsのintern関数を呼び出すことでインターニングする方法を以下に示します(シンボルの作成とインターニングを参照):

emacs_value fintern = env->intern (env, "intern");
emacs_value sym_name =
  env->make_string (env, name_str, strlen (name_str));
emacs_value symbol = env->funcall (env, fintern, 1, &sym_name);
関数: emacs_value funcall (emacs_env *env, emacs_value func, ptrdiff_t nargs, emacs_value *args)

この関数は、指定された func を呼び出し、args が指す配列から nargs 個の引数を渡します。引数 func には、関数シンボル(例:前述の intern によって返されるもの)、make_function によって返されるモジュール関数(モジュール関数の記述 を参照)、C で記述されたサブルーチンなどが指定可能です。nargs が 0 の場合、args は NULL ポインタを指定できます。

この関数は、func が返した値を返します。

モジュールに長時間実行される可能性のあるコードが含まれている場合は、そのコード内で適宜、ユーザーが終了を希望しているか(例えば C-g と入力するかなど)を確認するのがよいでしょう(終了 を参照)。そのために、Emacs 26.1 以降で利用可能な以下の関数が用意されています。

関数: bool should_quit (emacs_env *env)

この関数は、ユーザーが終了を希望した場合に true を返します。その場合、モジュール関数は進行中の処理を中断し、可能な限り速やかに復帰することを推奨します。ほとんどの場合は、代わりに process_input を使用してください。

ユーザーが終了したいかどうかの確認に加えて入力イベントを処理するには、Emacs 27.1 から利用可能な以下の関数を使用してください。

関数: enum emacs_process_input_result process_input (emacs_env *env)

この関数は、保留中の入力イベントを処理します。ユーザーが終了を希望した場合、またはシグナル処理中にエラーが発生した場合は emacs_process_input_quit を返します。その場合、モジュール関数は進行中の処理を中断し、可能な限り速やかに復帰することを推奨します。モジュールコードの実行を継続できる場合は、process_input は emacs_process_input_continue を返します。env に保留中の非ローカル終了が存在しない場合に限り、戻り値は emacs_process_input_continue となります。process_input を呼び出した後にモジュールの実行を継続した場合、変数の値やバッファの内容といったグローバル状態が、任意の形で変更されている可能性があります。

関数: int open_channel (emacs_env *env, emacs_value pipe_process)

Emacs 28 から利用可能なこの関数は、既存のパイププロセスへのチャネルを開きます。pipe_process は、make-pipe-process によって作成された既存のパイププロセスを参照する必要があります。パイププロセス。成功した場合、戻り値としてパイプへの書き込みに使用できる新しいファイルディスクリプタが返されます。他のすべてのモジュール関数とは異なり、モジュール環境がアクティブでない場合でも、任意のスレッドから返されたファイルディスクリプタを使用できます。write 関数を使用して、ファイルディスクリプタへの書き込みが可能です。書き込みが完了したら、close を使用してファイルディスクリプタを閉じます。(libc)Low-Level I/O。