Spec-Zone.ru › Elisp

Способы объединения советов

Ниже приведены возможные значения аргумента where для add-function и advice-add, задающие способ объединения совета function и исходной функции.

:before

Вызвать function перед старой функцией. Обе функции получают одинаковые аргументы, а результатом объединения становится возвращаемое значение старой функции. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (apply function r) (apply oldfun r))

(add-function :before funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function) для обычных хуков.

:after

Вызвать function после старой функции. Обе функции получают одинаковые аргументы, а результатом объединения становится возвращаемое значение старой функции. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))

(add-function :after funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function 'append) для обычных хуков.

:override

Полностью заменить старую функцию новой. Разумеется, старую функцию можно восстановить, позднее вызвав remove-function.

:around

Вызвать function вместо старой функции, передав старую функцию в качестве дополнительного аргумента функции function. Это наиболее гибкий способ объединения. Например, он позволяет вызвать старую функцию с другими аргументами, вызвать её несколько раз или внутри привязки let; можно также в одних случаях делегировать работу старой функции, а в других — полностью переопределить её. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (apply function oldfun r))
:before-while

Вызвать function перед старой функцией и не вызывать старую функцию, если function возвращает nil. Обе функции получают одинаковые аргументы, а результатом объединения становится возвращаемое значение старой функции. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (and (apply function r) (apply oldfun r)))

(add-function :before-while funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function), когда hookvar запускается с помощью run-hook-with-args-until-failure.

:before-until

Вызвать function перед старой функцией и вызывать старую функцию только в том случае, если function возвращает nil. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (or (apply function r) (apply oldfun r)))

(add-function :before-until funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function), когда hookvar запускается с помощью run-hook-with-args-until-success.

:after-while

Вызвать function после старой функции и только в том случае, если старая функция вернула значение, отличное от nil. Обе функции получают одинаковые аргументы, а результатом объединения становится возвращаемое значение function. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (and (apply oldfun r) (apply function r)))

(add-function :after-while funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function 'append), когда hookvar запускается с помощью run-hook-with-args-until-failure.

:after-until

Вызвать function после старой функции и только в том случае, если старая функция вернула nil. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (or  (apply oldfun r) (apply function r)))

(add-function :after-until funvar function) для хуков с одной функцией сопоставим с (add-hook 'hookvar function 'append), когда hookvar запускается с помощью run-hook-with-args-until-success.

:filter-args

Сначала вызвать function и использовать результат (который должен быть списком) в качестве новых аргументов для старой функции. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return

Сначала вызвать старую функцию и передать результат функции function. В частности, объединение двух функций работает следующим образом:

(lambda (&rest r) (funcall function (apply oldfun r)))
:interactive-only

Хотя параметр where задаёт способ объединения тел двух функций, он фактически не влияет на объединение интерактивных форм. Поэтому в некотором смысле это действует противоположно :override: вызывается только старая функция, как если бы к ней не применялся совет. Однако это по-прежнему влияет на интерактивную форму так же, как и любое другое значение where: интерактивная форма function, если она есть, заменяет интерактивную форму oldfun, а если это лямбда-выражение, то в качестве аргумента ей передаётся интерактивная форма function. Пример см. в разделе advice-eval-interactive-spec.

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/Advice-Combinators.html

Spec-Zone.ru

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