特定のコンディションが満たされたときだけ特定のコードわコンパイルしたいときもあり得るでしょう。これは特にEmacsパッケージの保守時に当てはまるケースです。他のバージョンのEmacsとパッケージの互換性を保つためには、Emacsのカレントバージョンにおいて廃止となった関数や変数を使う必要が生じるかもしれません。
実行時に単に新旧のフォームを選択するコンディショナルフォームを使うこともできますが、これは廃止となった関数/変数に関する煩わしい警告メッセージが出力されがちです。そのような状況にたいしてはマクロstatic-if
が便利です。これはスペシャルフォームif
にしたがってパターン化されたマクロです(条件を参照)。
古いバージョンのEmacsにたいしてこの機能を使用するには、Emacsソースファイルlisp/subr.elからstatic-if
のソースをパッケージにコピーしてください。
マクロ展開時にconditionをテストする。値が非nil
ならマクロをthen-form、それ以外の場合にはprogn
で括ってelse-formsを展開する。else-formsは空でもよい。
以下はCCモードからこのマクロを使用する例。この例では新しいバージョンのEmacsではdefadvice
がコンパイルされないようにしている:
(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))))))