4.2.3. 型指定子
型指定子はシンボル、クラス、リストになれます。 figure_4-2
は、標準の原始的な型指定子であるシンボルのリストです。 figure_4-3
は、標準の合成された型指定子の名前のリストです。 構文の情報は、対応する型指定子の辞書の説明をみて下さい。 これはdefclass
, define-condition
, defstruct
, deftype
を使うことで新しい型指定子を定義することができます。
Figure 4-2. 標準の原始的な型指定子
もし型指定子がリストであり、そのリストのcar
がシンボルのとき、 リストのrest
部は型の補助的な情報です。 そのような型指定子は合成された型指定子と呼ばれます。 明示的に別段の定めがある場合を除き、 補助的な項目は不特定とすることができます。 不特定の補助的な項目は、*
と書くことで指定します。 例えばvector
の完全な指定は、 要素の型とvector
の長さが現れます。
vector double-float 100) (
下記に長さを不特定にしたものを示します。
vector double-float *) (
下記に要素の型を不特定にしたものを示します。
vector * 100) (
2つの型指定子が同じで、 最初の型指定子が*
を持つのに対して、 2番目の型指定子はより明示的な指定をしているとします。 このとき、2番目の型指定子は1番目の型指定子のサブタイプを表します。
もしリストがひとつか複数の不特定な項目で終わっていたとき、 それらの項目は省略できます。 もし補助的なリスト全てに*
が現れてそれらを省略したときは、 かっこもまた省略可能です(そのリストはシンボルのcar
部に置き換えられます)。 例えば、(vector double-float *)
は(vector double-float)
に省略できますし、 (vector * *)
は(vector)
に省略でき、さらにvector
に省略できます。
Figure 4-3. 標準の合成された型指定子の名前
次の表は原始的な型指定子としては使えない 合成された型指定子の名前として使われる 定義された名前を表します。
and |
mod |
satisfies |
eql |
not |
values |
member |
or |
Figure 4-4. 標準の合成のみの型指定子の名前
新しい型指定子は、次の2つの方法で定義できます。
defstruct
を使い:type
オプションを使用せずに 構造体を定義することか、 あるいはdefclass
かdefine-condition
を使い クラスを定義することで、 自動的にクラスか構造体の名前が 新しい型指定子のシンボルになります。deftype
は、他の型指定子をの省略形として、 派生された型指定子を定義するときに使用できます。クラスオブジェクトは型指定子として使用できます。 この方法で使ったとき、それはクラスの全てのメンバーの集合を示します。
次の表は、型と宣言に関係する定義された名前を示します。
coerce |
defstruct |
subtypep |
declaim |
deftype |
the |
declare |
ftype |
type |
defclass |
locally |
type-of |
define-condition |
proclaim |
typep |
Figure 4-5. 型と宣言に関係する定義された名前
次の表は、原始的な型指定子と合成された型指定子の 両方の型指定子として使われる定義された名前を示します。 これは、figure_4-2
とfigure_4-3
を合わせたリストです。
Figure 4-6. 標準の型指定子の名前