Условная компиляция
Иногда требуется, чтобы определённый код компилировался только при выполнении заданного условия. Особенно часто это бывает при сопровождении пакетов 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 может быть пустым.
- Макрос: static-when condition body...
Проверяет condition во время раскрытия макроса. Если его значение не равно
nil, раскрывает макрос так, чтобы последовательно вычислить все формы body и вернуть значение последней из них либоnil, если форм нет.
- Макрос: static-unless condition body...
-
Проверяет condition во время раскрытия макроса. Если его значение равно
nil, раскрывает макрос так, чтобы последовательно вычислить все формы body и вернуть значение последней из них либоnil, если форм нет.Вот пример его использования в 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) "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))))))
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditional-Compilation.html