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

8.2.2 Lispマクロ

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)

キルリング内の直前にクリップされたテキストに、新たにクリップされたテキストのコピーを連結します。