Как удалить defmethod для структуры

У меня есть 2 разрушения: monster и orc. orc включает monster. Обычный монстр имеет общие методы защиты, названные monster-show и monster-hit. orc имеет специализированный monster-hit, но по-прежнему сохраняет общий monster-show. Моя проблема в том, что я случайно назвал специализированный метод для orc неправильным именем (monster-show), поэтому теперь, когда я пытаюсь использовать общий monster-show, он запускает код, который не должен (неправильно названный defmethod, который я скомпилировал) вместо запуска родовой метод.

Есть ли способ избавиться от специализированного defmethod в Slime + SBCL?


person Collin Bell    schedule 18.01.2018    source источник


Ответы (3)


Вот как я бы сделал это с помощью инспектора слизи:

Введите общую функцию, которую вы хотите изменить:

CL-USER> #'monster-show
#<GENERIC FUNCTION: MONSTER-SHOW>

Наведите на него курсор и осмотрите объект, набрав C-c C-v TAB

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

Также по описанию вашей иерархии, вероятно, было бы разумнее использовать настоящие классы, а не структуры. Структурные десятки не дают особенно большого ускорения по сравнению с классами.

person Dan Robertson    schedule 18.01.2018
comment
Я добавляю маршрут Mx к этому в комментариях, а затем приму ваш ответ. M-x slime-inspect RET #'monster-show. Спасибо! - person Collin Bell; 18.01.2018

Если у вас нет IDE или чего-то подобного, вы можете использовать remove-method:

(remove-method #'monster-show
               (find-method #'monster-show
                            ()
                            (list (find-class 'orc))))
person Svante    schedule 18.01.2018

На космических маках с злым режимом :slime-inspect RET #'monster-show. Выберите метод удаления на orc.

person Collin Bell    schedule 18.01.2018