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

22.2.1 interactive の使用

本節では、Lisp関数を対話的に呼び出し可能なコマンドにするためのinteractive形式の書き方と、コマンドのinteractive形式の確認方法について説明します。

特殊形式: インタラクティブ &optional arg-descriptor &rest modes

この特殊形式は、関数がコマンドであり、したがって対話的に呼び出せる(M-x 経由、またはそれにバインドされたキーシーケンスの入力による)ことを宣言します。引数 arg-descriptor は、コマンドが対話的に呼び出された際に、そのコマンドへの引数をどのように計算するかを宣言します。

コマンドは、他の関数と同様にLispプログラムから呼び出すことができますが、その場合、呼び出し側が引数を指定するため、arg-descriptor は効果を発揮しません。

interactive フォームは、関数本体のトップレベル、または関数シンボルの interactive-form プロパティ(シンボルプロパティ を参照)に配置されている必要があります。コマンドループが関数を呼び出す前にこのフォームを探すため、効果を発揮します(インタラクティブ呼び出し を参照)。関数が呼び出されると、その本体内のすべてのフォームが実行されます。このとき、本体内に interactive フォームが存在する場合、そのフォームは引数を評価することなく単に nil を返します。

modes リストを使用すると、コマンドをどのモードで使用させるかを指定できます。modes を指定した際の効果や使用タイミングの詳細については、コマンドのモード指定を参照してください。

慣例として、interactive フォームは関数本体の最初のトップレベルフォームとして配置すべきです。interactive-form シンボルプロパティと関数本体の両方に interactive フォームが存在する場合、前者が優先されます。interactive-form シンボルプロパティを使用すると、関数を再定義することなく、既存の関数にインタラクティブフォームを追加したり、引数のインタラクティブな処理方法を変更したりできます。

引数 arg-descriptor には3つの可能性があります。

関数: interactive-form function

この関数は、function の interactive 形式を返します。function が対話的に呼び出し可能な関数(対話的呼び出し を参照)である場合、値はコマンドの interactive 形式 (interactive spec) となり、これにより引数の計算方法が指定されます。そうでない場合、値は nil となります。function がシンボルである場合は、その関数定義が使用されます。OClosure に対して呼び出された場合、処理は汎用関数 oclosure-interactive-form に委譲されます。

関数: oclosure-interactive-form function

interactive-formと同様に、この関数はコマンドを受け取り、そのインタラクティブ形式を返します。異なる点は、これがジェネリック関数であり、functionがOClosureである場合にのみ呼び出されることです(Open Closuresを参照)。その目的は、一部のOClosure型において、インタラクティブ形式をスロットの一つに保持するのではなく、動的に計算できるようにすることにあります。

これは、例えば kmacro 関数において、すべて共通のインタラクティブフォームを持つため、そのメモリサイズを削減する目的で使用されます。また、インタラクティブフォームが構成要素のインタラクティブフォームから計算される advice 関数においても使用されており、これにより計算をより遅延的に行い、構成要素のいずれかが再定義された際にインタラクティブフォームを正しく調整できるようになっています。


脚注

(19)

一部の要素は、実際には2つの引数を提供します。