Go to the first, previous, next, last section, table of contents.

複数の式を評価する関数

backward-2, forward-word-2 はそれほど役に立つ関数ではありません。これらは別の 関数でもできたこと以外は、何もしていません。また、キーシーケンスで実行させるこ ともできていません。

何か新しいことをするための関数を作るには、複数の関数をまとめる必要があります。 let を用いた例にあったように、関数は複数の式を評価することができます。以下に、 3つの式をその本体に持つ関数を示します。これらの式は、現われた順に評価されま す。

      (defun capitalize-last-letter ()
        (forward-word 1)
        (backward-char 1)
        (capitalize-word 1))

この定義を(自分の)バッファにタイプして、評価してみて下さい。次に、そのバッファ 中の word の前にポイントを位置付け、 M-ESC でこの関数を呼び出して下さい。そう すると、この word の最後の文字は大文字になります。このようなことをするコマンド は前には存在しませんでした!

この関数がどのように働いているかわかりますか? これは (forward-word 1) でポイ ントを words の終ろに動かし、 (backward-char 1) で 1 文字逆方向に動かし、ポイ ントが word の最後の文字に位置付くようにします。最後に、ポイントが位置付けられ ている文字を含め(word の)その後の部分を大文字にします。

これは M-f C-b M-c とタイプしたのと同じことになります。これは驚くにはあたりま せん。なぜなら (C-h c が示すように) M-f は forward-word を起動し、 C-b は backward-char を起動し、 M-c は capitalize-word を起動するからです。

次にしたいことは、この新しい関数をキーシーケンスで実行することです。これをする には、インタラクティブな関数という新しい概念を導入しなくてはいけません。

関数は(全て)式中にその名前を入れ、それを (eval-last-expression もしくはいくつ かの類似したコマンドを用い) 評価することで実行することができますが、ある種の関 数のみ、それ用のキーシーケンスを定義し実行することができます。これがインタラク ティブということで意味されることです。インタラクティブな関数はまたコマンドとも 呼ばれます。

関数を定義する場合は(常に)、そうしようと思えばそれをインタラクティブにすること ができますが、通常は、"ユーザーがその関数をインタラクティブに(訳注:対話的に) 用いたがるであろう" ということが予想される場合にのみこれを行ないます。例へば、 関数 forward-word は、(ユーザーが) 1 word 先に動くためのキーを必要とするためイ ンタラクティブにされているわけです。しかし、関数 + はインタラクティブにされま せんでした。そうすることはあまり役に立たないからです。

ある関数をインタラクティブにするためには、その関数定義において、式 (interactive) を評価する最初の式として置います。以下に、(前の関数を)インタラク ティブにしたものと、それをキーシーケンス C-x ! にバインドする式を示します。

      (defun capitalize-last-letter ()
        (interactive)
        (forward-word 1)
        (backward-char 1)
        (capitalize-word 1))
      => capitalize-last-letter
      (define-key global-map "\-x!" 'capitalize-last-letter)
      => capitalize-last-letter

これらの式を評価し、この新しいキーバインディングでこの関数を動かしてみて下さ い。 [end]


Go to the first, previous, next, last section, table of contents.