特定の条件が成立したときにのみ、あるコードをコンパイルさせたい場面があるでしょう。これは特にEmacsパッケージのメンテナンスにおいて顕著です。パッケージを旧バージョンのEmacsと互換性に保つためには、現行バージョンのEmacsでは廃止された関数や変数を使用する必要が生じる場合があります。
実行時に条件式を用いて新旧のフォームを選択することもできますが、そうすると廃止された関数や変数に関する煩わしい警告メッセージが出力されがちです。こうした状況では、マクロ
static-if が便利です。これは特殊フォーム if(条件式を参照)をモデルにしています。
この機能を旧バージョンのEmacsで使用するには、Emacsのソースファイル lisp/subr.el から static-if
のソースをパッケージにコピーしてください。
マクロ展開時に condition をテストする。その値が nil 以外であればマクロを then-form
に展開し、そうでなければ progn で囲まれた else-forms に展開する。else-forms
は空であってもよい。
マクロ展開時に condition をテストする。その値が nil 以外であれば、マクロを展開してすべての body
形式を順次評価し、最後のものの値を返す。該当するものがない場合は nil を返す。
マクロ展開時に condition をテストする。その値が nil であれば、マクロを展開してすべての body
形式を順次評価し、最後のものの値を返す。該当するものがない場合は nil を返す。
以下は、新しいバージョンのEmacsでdefadvice形式がコンパイルされるのを防ぐCC
Modeにおける使用例です:
(static-if (boundp 'comment-line-break-function)
(progn)
(defvar c-inside-line-break-advice nil)
(defadvice indent-new-comment-line (around c-line-break-advice
activate preactivate)
"Call `c-indent-new-comment-line' if in CC Mode."
(if (or c-inside-line-break-advice
(not c-buffer-is-cc-mode))
ad-do-it
(let ((c-inside-line-break-advice t))
(c-indent-new-comment-line (ad-get-arg 0))))))