Как я могу удалить квалифицированный метод? - PullRequest
9 голосов
/ 12 мая 2011

Во время разработки я определил метод «initialize-instance: after», который через некоторое время больше не нужен и фактически мешает мне, потому что внутри него вызывается код, который больше не является допустимым.Так как функция unintern не имеет аргумента для квалификатора, есть ли способ, которым я могу "удалить" комбинацию символа-квалификатора метода, чтобы мне не пришлось slime-restart-inferior-lisp и загружатьПроект снова с самого начала?

Ответы [ 3 ]

16 голосов
/ 12 мая 2011

Вы можете использовать стандартные функции find-method и remove-method, чтобы сделать это:

(remove-method (find-method #'frob '(:before) '(vehicle t)))

Я считаю, что гораздо проще использовать инспектор слизи.Если ваша функция называется frob, вы можете использовать M-x slime-inspect #'frob RET, чтобы просмотреть список всех методов в frob и выбрать отдельные методы для удаления.

5 голосов
/ 12 мая 2011

См. Ответ от Xach.

Методы собраны в универсальные функции. UNINTERN не имеет к этому никакого отношения. Вам нужно удалить метод из универсальной функции.

Большинство распространенных IDE Lisp имеют способ сделать это. Либо через редактор (M-x undefine ...), либо через какой-то инструмент инспектора.

0 голосов
/ 11 апреля 2013

С AllegroCL 9.0.Ответ Xach у меня не сработал полностью.

Определение моего метода:

defmethod my-method* ((expr forall-expr) bindings)

forall-expr - это класс, а привязки нетипизированы.Чтобы найти метод, который мне пришлось использовать:

(find-method #'my-method* '() (mapcar #'find-class '(forall-expr t)))

Затем, чтобы удалить определение метода, который я использовал:

(remove-method #'my-method* (find-method #'my-method* '() (mapcar #'find-class '(forall-expr t))))

Я смог выяснить это из сноски 7 в http://www.gigamonkeys.com/book/object-reorientation-classes.html и примеры из Lisp HyperSpec for find-method http://clhs.lisp.se/Body/f_find_m.htm.

...