Рекомендация именованных функций
Распространенное использование рекомендаций — для именованных функций и макросов. Можно использовать add-function, как в:
(add-function :around (symbol-function 'fun) #'his-tracing-function)
Но следует использовать advice-add и advice-remove вместо этого. Этот отдельный набор функций для управления рекомендациями, применяемыми к именованным функциям, предлагает следующие дополнительные возможности по сравнению с add-function: они умеют обрабатывать макросы и автоматически загружаемые функции, они позволяют describe-function сохранить исходный строку документации, а также документировать добавленную рекомендацию, и они позволяют добавлять и удалять рекомендации до определения функции.
advice-add может быть полезно для изменения поведения существующих вызовов существующей функции, не переопределяя всю функцию. Однако это может быть источником ошибок, так как существующие вызывающие функции могут предполагать старое поведение и работать неправильно, когда поведение изменяется рекомендацией. Рекомендации также могут вызвать путаницу при отладке, если человек, выполняющий отладку, не замечает или не помнит, что функция была изменена рекомендацией.
По этим причинам рекомендации следует использовать только в тех случаях, когда поведение функции нельзя изменить другим способом. Если можно сделать то же самое с помощью хука, это предпочтительнее (см. Хуки). Если вы просто хотите изменить действие определенного ключа, лучше написать новую команду и переназначить старые сочетания клавиш на новую (см. Переназначение команд).
При написании кода для выпуска, для использования другими, старайтесь избегать включения рекомендаций в него. Если у функции, которую вы хотите рекомендовать, нет хука для выполнения задачи, пожалуйста, обратитесь к разработчикам Emacs с просьбой добавить подходящий хук. Особенно файлы исходного кода Emacs не должны применять рекомендации к функциям в Emacs. (В настоящее время существуют некоторые исключения из этой конвенции, но мы нацелены на их исправление.) Обычно чище создать новый хук в foo, и заставить bar использовать хук, чем bar размещать рекомендации в foo.
Специальные формы (см. Специальные формы) не могут быть рекомендованы, однако макросы могут быть рекомендованы, аналогично функциям. Конечно, это не повлияет на код, который уже был преобразован макросом, поэтому необходимо убедиться, что рекомендации установлены до расширения макроса.
Можно рекомендовать примитив (см. Что такое функция), но обычно этого не следует делать по двум причинам. Во-первых, некоторые примитивы используются механизмом рекомендаций, и их рекомендации могут привести к бесконечной рекурсии. Во-вторых, многие примитивы вызываются непосредственно из C, и такие вызовы игнорируют рекомендации; следовательно, получается запутанная ситуация, когда некоторые вызовы (происходящие из Lisp-кода) подчиняются рекомендациям, а другие вызовы (из C-кода) — нет.
- Макрос: define-advice символ (где список-лямбда &опционально имя глубина) &rest тело
Этот макрос определяет рекомендацию и добавляет её к функции с именем символ. Рекомендация — это анонимная функция, если имя —
nilили функция с именемsymbol@name. См.advice-addдля объяснения других аргументов.
- Функция: advice-add символ где функция &опционально props
Добавьте рекомендацию функция к именованной функции символ. где и props имеют то же значение, что и для
add-function(см. Основные примитивы рекомендаций).
- Функция: advice-remove символ функция
Удалите рекомендацию функция из именованной функции символ. функция также может быть
nameчасти рекомендации.
- Функция: advice-member-p функция символ
Возвращает не-
nil, если рекомендация функция уже присутствует в именованной функции символ. функция также может бытьnameчасти рекомендации.
- Функция: advice-mapc функция символ
Вызовите функция для каждой рекомендации, которая была добавлена к именованной функции символ. функция вызывается с двумя аргументами: функцией рекомендации и её свойствами.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Named-Functions.html