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)))

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

Spec-Zone.ru

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