typep

Title
typep
Type
Function
Arguments
typep OBJECT TYPE
Package
lisp
Section
データ型
File
typespec.l
OBJECT が TYPE の型であれば、non-nil な値を返します。

TYPE に与えることのできる引数には以下のようなものがあります。

1. 一般の型 
  builtin 関数(characterp、listp など)で判定します。

  'atom                'null           'ed:buffer
  'base-character      'number         'ed:marker
  'bignum              'package        'ed:process
  'character           'random-state   'ed:regexp
  'compiled-function   'ratio          'ed:syntax-table
  'cons                'real           'ed:menu
  'fixnum              'readtable      'ed:dde-handle
  'function            'sequence       'ed:window
  'hash-table          'stream         'ed:oledata
  'keyword             'symbol
  'list

2. 条件式・複合型
  条件を満たす場合に non-nil な値を返します。

  '(satisfies FUNC)      OBJECT を引数に FUNC を funcall した結果を返す
  '(member ELEMENTS)     OBJECT が ELEMENTS に含まれる
  '(eql OBJ)             OBJECT が OBJ に等しい
  '(not TYPE1)           OBJECT が TYPE2 の型でない
  '(and TYPE1 TYPE2 ...) OBJECT が TYPE1, TYPE2, ... すべての型である
  '(or TYPE1 TYPE2 ...)  OBJECT が TYPE1, TYPE2, ... いずれかの型である
  't                     常に真
  'nil                   常に偽

3. 文字
  'standard-char         文字のうち standard-char-p なもの
  'extended-char (*)     常に nil を返す(extended-char は存在しない?)

4. 数値
  範囲を指定できます。省略することも可能。
  MIN および MAX に、数値の代わりに * を与えると、
  下限(上限)を指定しなかったとみなされます。

  '(integer MIN MAX)
  '(float MIN MAX)
  '(rational MIN MAX)
  '(short-float MIN MAX)
  '(single-float MIN MAX)
  '(double-float MIN MAX)
  '(long-float MIN MAX)

  '(complex TYPE1)      integer 型、float 型などで区別可能。範囲指定はできない。

5. 一次元配列
  長さを指定できます。
  長さには整数値か * を指定します。省略も可能。

  '(simple-vector LENGTH)
  '(simple-string LENGTH)
  '(string LENGTH)
  
  '(vector TYPE1 LENGTH)       TYPE1 は t(普通のベクタ)または character(文字列)
  
6. 一次元以上の配列
  '(simple-array TYPE1 DIM)    TYPE1 は t(普通のベクタ)または character(文字列)
  '(array TYPE1 DIM)           DIM は次元

  '(simple-array TYPE1 (DIMS)) TYPE1 は t(普通のベクタ)または character(文字列)
  '(array TYPE1 (DIMS))        DIMS は各次元のサイズ(たとえば 2x3 なら (2 3) )

7. defstruct で定義された構造体

使用例:
  ;; 一般の型
  (typep #\a 'character)
  => t
  (typep (selected-buffer) 'buffer)
  => t

  ;; 複合型
  (typep 3 '(satisfies oddp))       ; 奇数(関数 oddp による判定)
  => t
  (typep 'b '(member a b c))        ; a b c がリストとしてまとめられる
  => (b c)
  (typep 3 '(and atom number))      ; atom かつ number
  => t
  (typep 3 '(and atom number list)) ; atom かつ number かつ list
  => nil
  (typep 3 '(or atom number list))  ; atom または number または list
  => t

  ;; 数値
  (typep 3 'integer)                ; 範囲指定しないならリストにする必要なし
  => t
  (typep 3 '(integer 1 5))
  => t
  (typep x '(integer * 5))
  => t
  (typep x '(integer 5 *))
  => nil
  
  (typep #C(1 2) 'complex)
  => t
  (typep #C(1 2) '(complex float))
  => nil

  ;; 一次元配列
  (typep #(1 2 3) '(simple-vector 3))
  => t
  (typep #(1 2 3) '(vector t 3))
  => t
  (typep "abc" '(vector character 3))
  => t

  ;; 一次元以上の配列
  (setf a (make-array '(3 4)))
  => #2A((nil nil nil nil) (nil nil nil nil) (nil nil nil nil))
  (typep a '(array t *))     ; 次元を指定しない
  => t
  (typep a '(array t 2))     ; 2 次元配列
  => t
  (typep a '(array t (3 4))) ; サイズも一致
  => t
  (typep a '(array t (* 4))) ; サイズの一部だけを指定することも可能
  => t

  ;; 構造体
  (typep (selected-pseudo-frame) 'ed::pseudo-frame)
  => t
Seealso
si:canonicalize-type
type-of
subtypep
deftype
型一覧