3

各オブジェクトが独自のノードを取得するような方法で、CLOS オブジェクトから GraphViz ノード名を作成する方法が必要です。オブジェクトを変更して GraphViz ビジュアライゼーションを再作成すると、残っているオブジェクトに対して同じノード名が取得されます (参照的に) 同じ。

オブジェクトを印刷しようとすると、ほとんど良い結果が得られます (PRINT-OBJECTクラスをオーバーライドすることはないため)。

CL-USER> (format nil "~A" *g*)
"#<GREF {1002D22C81}>"

1002D22C81その部分だけを文字列として取得する方法はありますか? 次に、そのような GraphViz ノード名を作成できますN1002D22C81

または(format nil "~A" obj)、 の間の部分を取得して、結果を文字列として処理する必要があり{}ますか?

4

1 に答える 1

8

16 進数はオブジェクト アドレスです。ガベージ コレクション後に変更される可能性があります。あなたの実装はそれを直接取得する関数を提供するかもしれませんが、それを使うべきではないと思います。

nameオブジェクトにスロットを追加し、たとえばgensym.

すべてのオブジェクトを追跡したい場合はintern、名前を特別なパッケージに入れてオブジェクトに設定するsymbol-valueこともできます (これにより、オブジェクトの名前を設定するか、設定を解除するか、オブジェクトを削除するまで、GCがオブジェクトを収集できなくなることに注意してください) 。前述のスペシャルパッケージ)。uninternsymbol-value

PS。オーバーライドしても、オブジェクトのアドレスを取得できますprint-object- に渡すだけ:identity tですprint-unreadable-object

PPS。(format nil "~A" x)と同じであることはご存じだと思います(princ-to-string x)

于 2013-02-13T14:53:28.207 に答える