Бывают случаи, когда вы хотите, чтобы определенный код компилировался только при выполнении определенного условия. Это особенно актуально при поддержке пакетов Emacs; чтобы сохранить совместимость пакета со старыми версиями Emacs, вам может потребоваться использовать функцию или переменную, которая устарела в текущей версии Emacs.
Вы могли бы просто использовать условную форму для выбора старой или новой формы во время выполнения, но это часто приводит к появлению раздражающих предупреждений об устаревшей функции/переменной. Для таких ситуаций очень пригодится макрос
static-if. Он основан на специальной форме
if (см. Условные операторы).
Чтобы использовать эту возможность для более старой версии Emacs, скопируйте исходный код
static-if из исходного файла Emacs lisp/subr.el
в ваш пакет.
Проверяет condition во время расширения макроса. Если ее значение не равно
nil, макрос расширяется до then-form, в противном случае расширяется до
else-forms, заключенных в progn. else-forms может быть пустым.
Вот пример его использования из CC Mode, который предотвращает компиляцию формы
defadvice в новых версиях 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)
"Вызывает 'c-indent-new-comment-line', если находится в 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))))))