2011-05-12 46 views
8

在開發過程中,我定義了一個'initialize-instance:after'方法,這個方法在一段時間之後不再需要,並且實際上在我的方式中,因爲它內部調用了無效的代碼。由於unintern函數沒有限定符的參數,有什麼辦法可以「解除」方法的符號限定符組合,這樣我就不必再次執行slime-restart-inferior-lisp並再次加載項目從頭開始?我該如何取消一個合格的方法?

回答

15

您可以使用標準功能find-methodremove-method做到這一點:

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

我覺得它更容易使用粘液檢查。如果您的功能名稱爲frob,則可以使用M-x slime-inspect #'frob RET查看frob上所有方法的列表,並選擇單個要刪除的方法。

+0

如果你希望對這種事情使用粘液檢查,請確保你的'黏液 - 貢獻'中有「粘液檢查員」。通用的煤泥檢查員沒有(至少在目前...)使這種功能容易訪問。 – dat 2016-09-21 18:46:23

5

請參閱Xach的答案。

方法在泛型函數中收集。 UNINTERN與此無關。你想要的是從通用函數中刪除一個方法。

最常見的Lisp IDE有辦法做到這一點。通過編輯器(M-x undefine ...)或通過一些檢查工具。

0

隨着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)))) 

我能夠在http://www.gigamonkeys.com/book/object-reorientation-classes.html腳註7想出解決辦法,並從實例用於查找方法的Lisp HyperSpec http://clhs.lisp.se/Body/f_find_m.htm

相關問題