Function TYPE-OF
type-of object => typespec
object - オブジェクト
typespec - 型指定子
objectが要素という立場で保有されている型の 型指定子typespecを返却します。 返却値であるtypespecは下記の条件を満たします。
and, eql, member, not, or, satisfies, values, を含んでいないときは、その型自身を返却全てのオブジェクトobjectについて、 (typep object (type-of object))はtrueを返却します。 これは暗に、例えばリストフォームの function型指定子のように、 typepで有効ではない型指定子はtype-ofから 決して返却しないことを意味しています。
type-ofの返却値の型は、 常にclass-ofによる返却値のクラスの 認識可能なサブタイプです。 つまり、下記のようになります。
(subtypep (type-of object) (class-of object)) => true, trueメタクラスがstructure-class, standard-class, またはコンディションのobjectについて、 class-ofによって返却されるクラスがが正しい名前を持つとき、 type-ofは、その名前を返却します。 それ以外のときは、クラス自身が返却されます。 特に、:typeオプションなしでdefstructによって定義された 構造体の構築関数で作られたobjectは、 type-of関数は構造体の名前を返却します。 また、make-conditionによって作られたobjectは、 返却値typespecはコンディション型の名前です。
次の型short-float, single-float, double-float, long-floatのobjectの返却値typespecは、 その型の認識可能なサブタイプです。
(type-of 'a) => SYMBOL
(type-of '(1 . 2))
=> CONS
OR=> (CONS FIXNUM FIXNUM)
(type-of #c(0 1))
=> COMPLEX
OR=> (COMPLEX INTEGER)
(defstruct temp-struct x y z) => TEMP-STRUCT
(type-of (make-temp-struct)) => TEMP-STRUCT
(type-of "abc")
=> STRING
OR=> (STRING 3)
(subtypep (type-of "abc") 'string) => true, true
(type-of (expt 2 40))
=> BIGNUM
OR=> INTEGER
OR=> (INTEGER 1099511627776 1099511627776)
OR=> SYSTEM::TWO-WORD-BIGNUM
OR=> FIXNUM
(subtypep (type-of 112312) 'integer) => true, true
(defvar *foo* (make-array 5 :element-type t)) => *FOO*
(class-name (class-of *foo*)) => VECTOR
(type-of *foo*)
=> VECTOR
OR=> (VECTOR T 5)なし。
なし。
array-element-type, class-of, defstruct, typecase, typep, 4.2. 型
実装はtype-ofが移植可能な値を返却するように 改良することを勧められます。