開発中に、「initialize-instance :after」メソッドを定義しましたが、これはしばらくすると不要になり、内部で無効なコードを呼び出すため、実際に邪魔になりました。unintern
関数には修飾子の引数がないため、メソッドのシンボル修飾子の組み合わせを「インターン解除」して、slime-restart-inferior-lisp を実行してからプロジェクトを再度ロードする必要がないようにする方法はありますか?開始?
3 に答える
標準機能find-method
を使用remove-method
してそれを行うことができます:
(remove-method (find-method #'frob '(:before) '(vehicle t)))
スライムインスペクタを使用する方がずっと簡単だと思います。関数の名前がfrob
の場合、 を使用M-x slime-inspect #'frob RET
してすべてのメソッドのリストを表示しfrob
、削除する個々のメソッドを選択できます。
Xach からの回答を参照してください。
メソッドはジェネリック関数にまとめられています。UNINTERNはそれとは何の関係もありません。必要なのは、ジェネリック関数からメソッドを削除することです。
ほとんどの Common Lisp IDE には、それを行う方法があります。エディター (Mx undefine...) を使用するか、インスペクター ツールを使用します。
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と、find-method の Lisp HyperSpec の例http://clhs.lisp.seからこれを理解できました。 /Body/f_find_m.htm .