LINUX.ORG.RU

Произвольные классы методов для дженериков

 ,


0

1

Я опять выхожу на связь, потому что ниасилил AMOP.

Вот допустим у меня есть

(defclass foo () ())
Я могу докинуть немного кода в его инициализацию:
(defmethod initialize-instance ((object foo) &rest initargs)
  (format t "foo instantiated~%")
  (call-next-method) )
Макрос defmethod на самом деле раскрывается во что-то вроде
(let ((gf (ensure-generic-function 'initialize-instance)))
  (add-method gf
    (make-instance
      (generic-function-method-class gf)
      ':specializers (list (find-class 'foo))
      ':lambda-list '(object &rest initargs)
      ... ) ) )
Класс добавляемого метода вытаскивается из самого дженерика. А можно ли добавить в дженерик метод другого класса (естественно, наследника того, что вернёт generic-function-method-class)? А для предопределённых дженериков (того же initialize-instance) так можно делать?

У defmethod какого-то интерфейса для этого нет. Я попробовал вручную вызвать add-method, но SBCL (который я запустил второй раз в жизни) ругается на какую-то фигню, которую я не понимаю (keyword parameter value is not a symbol, или типа того).

★★★

Последнее исправление: ilammy (всего исправлений: 1)

Таки привет. Немного не в тему, но потчему ты не использовал для initialize-instance qualifier :after? Ты же не станешь переопределять главный метод на практике?

По вопросу не могу ничего сказать - не задумывался, зачем оно мне

stopitplease
()
Ответ на: комментарий от stopitplease

Немного не в тему, но потчему ты не использовал для initialize-instance qualifier :after?

Да это просто пример defmethod.

А опция :method-class у defgeneric - это не то?

Не. Она как раз инициализирует тот слот, значение которого возвращается generic-function-method-class.

ilammy ★★★
() автор топика

А можно ли добавить в дженерик метод другого класса (естественно, наследника того, что вернёт generic-function-method-class)?

ЯННП, а разве это не естественное поведение defmethod?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Схрена ли? Если я ничё не путаю, то медоды - это экземпляры standard-method у обычных людей. Зачем этот класс вообще менять я хз, не настолько продвинутый, лучше спросить у ТС'а

stopitplease
()
Ответ на: комментарий от stopitplease

медоды - это экземпляры standard-method у обычных людей. Зачем этот класс вообще менять я хз,

А, так ТС хочет унаследовать от standard-method и подсунуть это дженерику, так что ли? Наркомания какая-то.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

У дженериков есть «естественный» класс методов для них. Он задаётся :method-class в defgeneric, его возвращает generic-function-method-class, экземпляры именно этого класса создаются defmethod. Для standard-generic по умолчанию им является standard-method.

Меня интересует, если я сделаю

(defclass fancy-method (standard-method) ())
то можно ли (и как) добавить в дженерик экземпляр именно этого класса методов. И есть ли какие-то ограничения для предопределённых дженериков (вдруг они умеют работать только со standard-method).

Вопрос возник потому, что я тут пытаюсь написать свой CLOS на Scheme и никак не мог избавиться от бесконечной рекурсии, возникавших при добавлении в MOP-дженерики нестандартных методов. Меня интересует, как там дела с этим в «нормальной» CLOS. Вдруг так нельзя делать.

[В общем, эту проблему-то решил (захардкодив обходной путь для стандартных методов), теперь мучаюсь над бесконечной рекурсией при добавлении методов в местный slot-value-using-class.]

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

А ensure-generic-function, которую ты сам написал, тебе никак не подойдет?

Из CLtL2 (я его больше люблю, чем CLHS, лол)

If function-name specifies a generic function that has a different :method-class value, the value is changed but any existing methods are not changed.

Типа, поменял, определил метод, поменял обратно, не?

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