16

Common Lisp では、CLOS クラスのデフォルトの文字列表現をオーバーライドして、そのクラスのオブジェクトがリストや配列などの他の型に埋め込まれている場合でも、CLOS クラスを呼び出したり、わかりやすいものを出力しformatたりするにはどうすればよいでしょうか?princ

たとえば、(format t "~a~%" x)x がソリューション クラスのインスタンスを保持しているときに呼び出すと、#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>の代わりに#<SOLUTION {BB7CD31}>.

これまでのところ、このクラスのインスタンスを含むことがわかっている印刷構造を処理するカスタム関数を作成することしかできませんでしたが、これは面倒です。Lisp は、この機能を無料で入手する方法を提供しているのでしょうか?

4

3 に答える 3

18

と を見ているはprint-object​​ずprint-unreadable-objectです。FOO次のような名前のクラスがあるとします。

(defclass foo ()
  ((name :accessor foo-name)))

そして、次のようなインスタンスを出力したいとします: #<FOO "xyz">where "xyz"is the content of slot name. この場合、次の実装はprint-objectあなたが望むことをします:

(defmethod print-object ((obj foo) out)
  (print-unreadable-object (obj out :type t)
    (format out "~s" (foo-name obj))))
于 2011-09-12T03:20:39.720 に答える
13

チェックアウトprint-object

于 2011-09-12T00:57:53.243 に答える
1

22.1.3.13 他のオブジェクトの印刷も参照すると、そのような状況の一般的なフォーマット マクロとしてprint-unreadable-object が提案されます。

于 2012-07-01T11:17:24.147 に答える