Previous: Nonlocal Exits, Up: Control Structures [Contents][Index]
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 macro
static-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.el
into your package.
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-forms
may be empty.
Here is an example of its use from CC Mode, which prevents a
defadvice
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))))))