Посоветуйте функцию
Несколько реализаций Common Lisp позволяют уведомлять (-> исправление) обычных функций. Советование — это нестандартная функция, и разные реализации предоставляют ее немного по-разному. Связанный механизм стандартизирован для общих функций CLOS с методами :before, :after и :around.
Цель состоит в том, чтобы добавить один или несколько патчей к функции после ее определения и без изменения исходного исходного кода.
Обычно для этого требуется, чтобы вызов этой функции не был встроенным.
Макрос ADVISE в Clozure Common Lisp
Исправление функций в Clozure CL можно выполнить с помощью макроса ADVISE
. См. документацию по советам.
Допустим, у нас есть функция FOOBAR
:
? (defun foobar (a b &key c (d :foobar)) (list a b c d))
FOOBAR
FOOBAR
вызывается внутри TEST
:
? (defun test (a) (foobar a 20 :c 30))
TEST
? (test 10)
(10 20 30 :FOOBAR)
Теперь мы хотим исправить FOOBAR
так, чтобы именованный аргумент :D
вызывался с другим значением.
Мы меняем список аргументов, чтобы вставить новый именованный аргумент после двух обязательных аргументов:
? (advise foobar (let ((arglist (list* (first arglist)
(second arglist)
:d :ipv6
(cddr arglist))))
(:do-it)) ; calling the original function
:when :around ; advise around it
:name :ipv6) ; the name of this advise
#<Compiled-function (CCL::ADVISED 'FOOBAR) (Non-Global) #x3020010D1CCF>
Теперь мы можем вызвать нашу функцию TEST
, и она вызовет рекомендуемую функцию FOOBAR
.
? (test 10)
(10 20 30 :IPV6)
Рекомендовать CCL:MAKE-SOCKET
Вы можете написать аналогичный совет для CCL:MAKE-SOCKET
.
Непроверенный:
(advise ccl:make-socket (let ((arglist (list* :address-family
:internet6
arglist)))
(:do-it))
:when :around
:name :internet6)
person
Rainer Joswig
schedule
08.09.2017