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_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.