Next: , Up: コマンドの定義   [Contents][Index]


22.2.1 interactiveの使用

このセクションでは、Lisp関数をインタラクティブに呼び出し可能なコマンドにするinteractiveフォームの記述方法と、コマンドのinteractiveフォームの検証方法について説明します。

Special Form: interactive &optional arg-descriptor &rest modes

このスペシャルフォームは関数がコマンドであり、したがって(M-xを通じて、またはそのコマンドにバインドされたキーシーケンスをエンターすることにより)インタラクティブに呼び出すことができることを宣言する。引数arg-descriptorは、そのコマンドがインタラクティブに呼び出されたときに引数を計算する方法を宣言する。

コマンドは他の関数と同じようにLisp関数から呼び出されるかもしれないが、その場合には呼び出し側は引数を提供して、arg-descriptorは効果をもたない。

interactiveフォームは関数body内のトップレベルに置くか、関数シンボルのinteractive-formプロパティ((シンボルのプロパティ)を参照)になければならない。これはコマンドループが関数を呼び出す前にinteractiveフォームを調べることにより効果をもつ(インタラクティブな呼び出しを参照)。一度関数が呼び出されると関数body内のすべてのフォームが実行される。このときbody内にinteractiveフォームが出現しても、そのフォームは引数の評価さえされず単にnilをリターンする。

modesリストではコマンドの使用を意図したモードを指定できる。modes指定の効果と使用するタイミングに関する詳細はコマンドにたいするモード指定を参照のこと。

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

引数arg-descriptorは以下の3つの可能性があります:

Function: interactive-form function

この関数はfunctioninteractiveフォームをリターンする。functionがインタラクティブに呼び出し可能な関数(インタラクティブな呼び出しを参照)なら、値はそのコマンドの引数を計算する方法を指定するinteractiveフォーム((interactive spec))である。それ以外なら値はnilfunctionがシンボルなら、そのシンボルの関数定義が使用される。OClosureで呼び出された場合には、処理はジェネリック関数oclosure-interactive-formに委譲される。

Function: oclosure-interactive-form function

この関数はinteractive-formと同様にコマンドを受け取り、そのインタラクティブなフォームをリターンする。これがジェネリック関数であること、そしてfunctionがOClosureのときだけ呼び出される点が異なる。この関数の目的は一部のOClosureタイプ(オープンクロージャを参照)にたいしてそれらのスロットの1つにインタラクティブフォームを格納するのではなく、動的なインタラクティブフォームの計算を可能にすることにある。

これはたとえばすべてのkmacroは同じインタラクティブフォームを共有するので、kmacroに用いることでメモリーサイズを削減できる。インタラクティブフォームが関数のコンポーネントのインタラクティブフォームから計算されるadvice関数においても、いずれかのコンポーネントが再定義された際の計算を更に遅延でき、かつインタラクティブフォームをより正確に調整できる。


Footnotes

(16)

いくつかの要素は実際に2つの引数を提供します。