Function TYPE-OF

UP


Function TYPE-OF

Function TYPE-OF

構文

type-of object => typespec

引数と戻り値

object - オブジェクト
typespec - 型指定子

定義

objectが要素という立場で保有されている型の 型指定子typespecを返却します。 返却値であるtypespecは下記の条件を満たします。

  1. objectが組み込み型の要素であるとき
  1. その組み込み型が認識可能なサブタイプであるならその型を返却
  2. その型が and, eql, member, not, or, satisfies, values, を含んでいないときは、その型自身を返却
  1. 全てのオブジェクトobjectについて、 (typep object (type-of object))trueを返却します。 これは暗に、例えばリストフォームの function型指定子のように、 typepで有効ではない型指定子はtype-ofから 決して返却しないことを意味しています。

  2. type-ofの返却値の型は、 常にclass-ofによる返却値のクラスの 認識可能なサブタイプです。 つまり、下記のようになります。

(subtypep (type-of object) (class-of object)) =>  true, true
  1. メタクラスがstructure-class, standard-class, またはコンディションのobjectについて、 class-ofによって返却されるクラスがが正しい名前を持つとき、 type-ofは、その名前を返却します。 それ以外のときは、クラス自身が返却されます。 特に、:typeオプションなしでdefstructによって定義された 構造体の構築関数で作られたobjectは、 type-of関数は構造体の名前を返却します。 また、make-conditionによって作られたobjectは、 返却値typespecはコンディション型の名前です。

  2. 次の型short-float, single-float, double-float, long-floatobjectの返却値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が移植可能な値を返却するように 改良することを勧められます。


TOP, Github