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

11.8 条件付きコンパイル

特定の条件が成立したときにのみ、あるコードをコンパイルさせたい場面があるでしょう。これは特にEmacsパッケージのメンテナンスにおいて顕著です。パッケージを旧バージョンのEmacsと互換性に保つためには、現行バージョンのEmacsでは廃止された関数や変数を使用する必要が生じる場合があります。

実行時に条件式を用いて新旧のフォームを選択することもできますが、そうすると廃止された関数や変数に関する煩わしい警告メッセージが出力されがちです。こうした状況では、マクロ static-if が便利です。これは特殊フォーム if(条件式を参照)をモデルにしています。

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

マクロ: static-if condition then-form else-forms...

マクロ展開時に condition をテストする。その値が nil 以外であればマクロを then-form に展開し、そうでなければ progn で囲まれた else-forms に展開する。else-forms は空であってもよい。

マクロ: static-when condition body...

マクロ展開時に condition をテストする。その値が nil 以外であれば、マクロを展開してすべての body 形式を順次評価し、最後のものの値を返す。該当するものがない場合は nil を返す。

マクロ: static-unless condition body...

マクロ展開時に 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))))))