11.8 Условная компиляция

Бывают случаи, когда вы хотите, чтобы определенный код компилировался только при выполнении определенного условия. Это особенно актуально при поддержке пакетов Emacs; чтобы сохранить совместимость пакета со старыми версиями Emacs, вам может потребоваться использовать функцию или переменную, которая устарела в текущей версии Emacs.

Вы могли бы просто использовать условную форму для выбора старой или новой формы во время выполнения, но это часто приводит к появлению раздражающих предупреждений об устаревшей функции/переменной. Для таких ситуаций очень пригодится макрос static-if. Он основан на специальной форме if (см. Условные операторы).

Чтобы использовать эту возможность для более старой версии Emacs, скопируйте исходный код static-if из исходного файла Emacs lisp/subr.el в ваш пакет.

Макрос: static-if condition then-form else-forms...

Проверяет 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))))))