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. 標準の型指定子の名前