10

開発中に、「initialize-instance :after」メソッドを定義しましたが、これはしばらくすると不要になり、内部で無効なコードを呼び出すため、実際に邪魔になりました。unintern関数には修飾子の引数がないため、メソッドのシンボル修飾子の組み合わせを「インターン解除」して、slime-restart-inferior-lisp を実行してからプロジェクトを再度ロードする必要がないようにする方法はありますか?開始?

4

3 に答える 3

16

標準機能find-methodを使用remove-methodしてそれを行うことができます:

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

スライムインスペクタを使用する方がずっと簡単だと思います。関数の名前がfrobの場合、 を使用M-x slime-inspect #'frob RETしてすべてのメソッドのリストを表示しfrob、削除する個々のメソッドを選択できます。

于 2011-05-12T11:02:46.170 に答える
5

Xach からの回答を参照してください。

メソッドはジェネリック関数にまとめられています。UNINTERNはそれとは何の関係もありません。必要なのは、ジェネリック関数からメソッドを削除することです。

ほとんどの Common Lisp IDE には、それを行う方法があります。エディター (Mx undefine...) を使用するか、インスペクター ツールを使用します。

于 2011-05-12T11:29:21.493 に答える
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と、find-method の Lisp HyperSpec の例http://clhs.lisp.seからこれを理解できました。 /Body/f_find_m.htm .

于 2013-04-10T22:52:46.220 に答える