11.8 条件コンパイル

特定のコンディションが満たされたときだけ特定のコードわコンパイルしたいときもあり得るでしょう。これは特にEmacsパッケージの保守時に当てはまるケースです。他のバージョンのEmacsとパッケージの互換性を保つためには、Emacsのカレントバージョンにおいて廃止となった関数や変数を使う必要が生じるかもしれません。

実行時に単に新旧のフォームを選択するコンディショナルフォームを使うこともできますが、これは廃止となった関数/変数に関する煩わしい警告メッセージが出力されがちです。そのような状況にたいしてはマクロstatic-ifが便利です。これはスペシャルフォームifにしたがってパターン化されたマクロです(条件を参照)。

古いバージョンのEmacsにたいしてこの機能を使用するには、Emacsソースファイルlisp/subr.elからstatic-ifのソースをパッケージにコピーしてください。

Macro: static-if condition then-form else-forms...

マクロ展開時に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))))))
This page has generated for branch:work/emacs-30_8ac894e2246f25d2a2a97d866b10e6e0b0fede5a, commit:b7b3c5b81a7a4eec61faa3ed3d7c731d52d3987b to check Japanese translation.