% Standard-Generic-Function DESCRIBE-OBJECT
Standard Generic Function DESCRIBE-OBJECT
describe-object object stream => implementation-dependent
describe-object ( object standard-object ) stream
object - オブジェクト
stream - ストリーム
ジェネリック関数describe-objectは、
objectの定義をstreamへ印刷します。
describe-objectはdescribeによって呼び出されるものであり、
ユーザーによって呼び出してはいけません。
各実装は、クラスstandard-objectのメソッドと、
その他にも適切なメソッドが常に存在することを保証するよう、
十分なクラスのメソッドを提供するよう要求されています。
実装は、他のクラスのメソッドを追加することは自由です。
ユーザーは、自身が作成したクラスについて、
実装が提供したメソッドから継承したくはないときは
describe-objectのメソッドを作成することができます。
describe-objectのメソッドは、
再帰的にdescribeを呼び出すことができます。
そのときのインデント、深さの制限、循環の検出は、
全て自動的に行われ、
もしdescribeがより深い構造の階層で再帰的に呼び出されたとき、
各メソッドは正確にひとつの階層構造だけになるように調整されます。
この規則に従わなかったときの結果は未定義です。
ある実装では、describe-objectメソッドの
引数に渡されたstreamは、元のstreamではなく、
describeの実装部分による中間的なストリームであることがあります。
したがって、メソッドはこのストリームの同一性について依存するべきではありません。
(defclass spaceship ()
((captain :initarg :captain :accessor spaceship-captain)
(serial# :initarg :serial-number :accessor spaceship-serial-number)))
(defclass federation-starship (spaceship) ())
(defmethod describe-object ((s spaceship) stream)
(with-slots (captain serial#) s
(format stream "~&~S is a spaceship of type ~S,~
~%with ~A at the helm ~
and with serial number ~D.~%"
s (type-of s) captain serial#)))
(make-instance 'federation-starship
:captain "Rachel Garrett"
:serial-number "NCC-1701-C")
=> #<FEDERATION-STARSHIP 26312465>
(describe *)
>> #<FEDERATION-STARSHIP 26312465> is a spaceship of type FEDERATION-STARSHIP,
>> with Rachel Garrett at the helm and with serial number NCC-1701-C.
=> <no values>
なし。
なし。
print-objectに適用可能なものは、
describe-objectに適用可能なものと、
同じ実装の技術を用いています。
describe-objectの返却値が未指定になっている理由は、
それらの全てのメソッドで明に(values)という式を
ユーザーに対して強制させることを避けるためです。
これはdescribeが行います。