condition-case 式のうち、すべてが順調に進むことを想定して評価される部分には
when が指定されています。コードでは when を用いて、string
変数が実在するテキストを指しているかどうかを判定しています。
when という式は、単にプログラマにとっての便宜上のものです。これは else 節を記述できない
if のようなものです。頭の中で when を
if に置き換えれば、何が起きているのか理解できるでしょう。Lisp
インタプリタが行っているのは、まさにそういうことです。
厳密に言えば、whenはLispマクロです。Lispマクロを使えば、新たな制御構造やその他の言語機能を定義できます。マクロはインタプリタに対し、値を計算することになる別のLisp式をどのように計算すべきかを指示します。この場合、その別の式とはif式のことです。
kill-region 関数定義には unless マクロもあり、これは when
の逆です。unless マクロは if
に似ていますが、then節を持たず、その代わりに暗黙的な nil を提供します。
Lispのマクロの詳細については、The GNU Emacs Lisp Reference ManualのMacrosを参照してください。C言語でもマクロが提供されています。これらは性質が異なりますが、同様に有用です。
when マクロに関して、condition-case 式において、文字列に内容がある場合は、別の条件式が実行されます。これは、then
部と else 部の両方を持つ if です。
(if (eq last-command 'kill-region)
(kill-append string (< end beg) yank-handler)
(kill-new string nil yank-handler))
直前のコマンドが kill-region への別の呼び出しであった場合は当時の部分が、そうでなければ
else 部分が評価されます。
yank-handlerはkill-regionのオプション引数であり、太字や斜体などテキストに追加されたプロパティをkill-appendおよびkill-new関数がどのように処理すべきかを指定します。
last-command は、これまで見たことのない Emacs
標準の変数です。通常、関数が実行されるたびに、Emacs は last-command
の値を直前のコマンドに設定します。
定義のこの部分では、if 式が直前のコマンドが kill-region であったかどうかを判定します。もしそうであれば、
(kill-append string (< end beg) yank-handler)
キルリング内の直前にクリップされたテキストに、新たにクリップされたテキストのコピーを連結します。