% 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
が移植可能な値を返却するように
改良することを勧められます。