LINUX.ORG.RU

Lisp: передача параметров следующему методу

 ,


0

3

Хочу переопределить стандартный конструктор объекта, чтобы он принимал дополнительный параметр, который обрабатывался специальным образом, а оставшиеся параметры и новый передавались родительскому методу.

(defmethod initialize-instance :around ((object my-class) &rest args &key my-param)
  (call-next-method object :another-param my-param args)))

Что-то типа такого (над my-param могут произойти какие-то операции, мне нужно не просто переименовать один key-параметр в другой).

Проблема находится в последней строчке - мне нужно как-то передать args не в качестве аргумента, а чтобы функция была вызвана с этим списком аргументов.

Можно сделать что-то подобное:

(defmethod initialize-instance :around ((object my-class) &rest args &key my-param)
  (apply 'call-next-method (cons object (cons :another-param (cons my-param args)))))

С обычной функцией такое-бы прокатило, но call-next-method судя по всему является макросом и поэтому я получаю ошибку, мол функция не найдена (хотя прямой вызов работает нормально).

Каким образом в Lisp можно заставить функцию скушать список, как если бы это были её прямые аргументы, а не один аргумент со значением списка?

★★★★★

мог забыть немного деталей. а на фига в :around вызывать call-next-method?

dave ★★★★★ ()

разве для :around не автоматом продолжается цепочка вызовов? давно читал amop. не помню точно

dave ★★★★★ ()
Последнее исправление: dave (всего исправлений: 1)
(defmethod ...
   (apply #'call-next-method ...))

но call-next-method судя по всему является макросом

Локальной функцией. Заглядывай уже в спек иногда.

antares0 ★★★ ()
Ответ на: комментарий от dave

а на фига в :around вызывать call-next-method?

Если не вызовешь цепочка методов оборвется. Он для ручного котроля и нужен.

antares0 ★★★ ()

1. Получить функцию - #'СИМВОЛ. APPLY можно передать просто символ (т.е. с кавычкой, но без решётки), и оно как-то иногда по нему находит функцию, но лучше просто всегда передавать функцию.

2. APPLY можно передать дополнительные аргументы перед списком:
(apply #'call-next-method object :another-param my-param args)

3. Вообще, собирать такой список можно функцией LIST*. Сравни:
(cons object (cons :another-param (cons my-param args)))
(list* object :another-param my-param args)

Но в данном случае тебе нужен код из пункта 2.

Gentooshnik ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.