Spec-Zone.ru › Elisp

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

Иногда требуется, чтобы определённый код компилировался только при выполнении заданного условия. Особенно часто это бывает при сопровождении пакетов 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API