% Function TYPE-OF
Function TYPE-OF
type-of object => typespec
object - オブジェクト
typespec - 型指定子
objectが要素という立場で保有されている型の 型指定子typespecを返却します。 返却値であるtypespecは下記の条件を満たします。
objectが組み込み型の要素であるとき
a. その組み込み型が認識可能なサブタイプであるならその型を返却
b. その型が
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が移植可能な値を返却するように
改良することを勧められます。