gnu.org (original) (raw)

11.8 Conditional Compilation

There will be times when you want certain code to be compiled only when a certain condition holds. This is particularly the case when maintaining Emacs packages; to keep the package compatible with older versions of Emacs you may need to use a function or variable which has become obsolete in the current version of Emacs.

You could just use a conditional form to select the old or new form at run time, but this tends to output annoying warning messages about the obsolete function/variable. For such situations, the macrostatic-if comes in handy. It is patterned after the special form if (see Conditionals).

To use this facility for an older version of Emacs, copy the source for static-if from the Emacs source file lisp/subr.elinto your package.

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

Test condition at macro-expansion time. If its value is non-nil, expand the macro to then-form, otherwise expand it to else-forms enclosed in a progn. else-formsmay be empty.

Here is an example of its use from CC Mode, which prevents adefadvice form being compiled in newer versions of Emacs:

(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))))))