Macro DEFCLASS

UP


Macro DEFCLASS

Macro DEFCLASS

構文

defclass class-name (superclass-name*) (slot-specifier*) [[class-option]] => new-class

slot-specifier ::= slot-name | (slot-name [[slot-option]])
slot-name ::= symbol
slot-option ::= {:reader reader-function-name}* |
                {:writer writer-function-name}* |
                {:accessor reader-function-name}* |
                {:initarg initarg-name}* |
                {:initform form} |
                {:type type-specifier} |
                {:documentation string}
function-name ::= {symbol | (setf symbol)}
class-option ::= (:default-initargs . initarg-list) |
                 (:documentation string) |
                 (:metaclass class-name)

引数と戻り値

class-name - nilではないシンボル
superclass-name - nilではないシンボル
slot-name - シンボル。 引数slot-nameは、変数名として使用できる構文として有効なシンボルです。
reader-function-name - nilではないシンボル。 :readerはひとつのスロットに複数指定できます。
writer-function-name - ジェネリック関数名。 :readerはひとつのスロットに複数指定できます。
accessor-function-name - nilではないシンボル。 :accessorはひとつのスロットに複数指定できます。
allocation-type - (member :instance :class)。 ひとつのスロットに最大ひとつの指定ができます。
initarg-name - シンボル。 :initargはひとつのスロットに対して複数指定できます。
form - フォーム。 :initformはひとつのスロットに最大ひとつの指定ができます。
type-specifier - 型指定子。 :typeはひとつのスロットに最大ひとつの指定ができます。
class-option - クラス全体か、全てのクラスのスロットを示します。
initarg-list - 名前とデフォルトの初期化値のフォームを 交互に並べた初期化引数のリストです。 :default-initargsは最大ひとつの指定ができます。
class-name - nilではないシンボル。:metaclassは最大ひとつの指定ができます。
new-class - 新しいクラスのオブジェクト

定義

マクロdefclassは、新しい名前の付いたクラスを定義します。 その結果として新しいクラスオブジェクトが返却されます。

defclassの構文は、 スロットの初期化引数を指定するオプション、 スロットのデフォルト初期化値を指定するオプション、 そしてスロットの値を読み書きするためのジェネリック関数のメソッドを 自動的に生成するようなオプションを提供します。 デフォルトではリーダおよびライタ関数は定義されていませんので、 その生成は明示的に要求する必要があります。 ただし、スロットは常にslot-valueを使用してアクセスすることができます。

新しいクラスを定義すると、同じ名前の型も定義されます。 式(typep object class-name)は、 引数objectのクラスがclass-name自身の名前のクラスであるか、 あるいはクラスclass-nameのサブクラスであるならば、trueを返します。 クラスオブジェクトは型指定子として使われることができます。 したがって(typep object class)は、 objectのクラスが、クラス自体か、 クラスのサブクラスである場合にtrueを返します。

引数のclass-nameは、新しいクラスの適切な名前を指定します。 もし同名のクラスが存在しており、 そのクラスがstandard-classのインスタンスであり、 さらにdefclassフォームによる新しいクラスの定義が、 standard-classクラスのクラスで指定されていた場合、 既存のクラスは再定義され、 そのクラス(サブクラスも含む)のインスタンスは、 それらが次にアクセスされたときに 新しい定義へと更新されます。 詳細は4.3.6. クラスの再定義を参照。

引数superclass-nameは、新しいクラスのダイレクトスーパークラスを指定します。 もしスーパークラスのリストが空のとき、 スーパークラスはメタクラスによって異なるデフォルト値になりますが、 standard-classのデフォルトはstandard-objectです。

新しいクラスは、各ダイレクトスーパークラスと、 それら各々のダイレクトスーパークラスの繋がりによって、 スロットとメソッドが継承されます。

スロットオプションは下記のものが使用可能です。

各クラスオプションは、クラス全体の設定です。
クラスオプションは下記のものが使用可能です。

標準クラスにおいては、defclassは下記のルールに注意してください。

オブジェクトシステムは、これらのルールに従わない場合にも 対応できるように拡張することが可能です。

いくつかのスロットは、 スーパークラスのクラスによって継承され、いくつかのものは隠蔽され、 あるいは局所スロットの定義によって変更されます。 クラスオプションは、:default-initargs以外継承されません。 スロットとスロットオプションがどのように継承されるかの詳しい説明は、 7.5.3. スロットの継承とスロットオプションをご確認ください。

defclassのオプションは拡張できます。 すべての実装は、自身が実装していない クラスオプションやスロットオプションを見た場合は、 エラーを通知することが要求されています。

複数のreader, writer, accessorを指定したり、 あるスロットに複数の初期化引数を指定するのは正しいです。 その他のスロットオプションが ひとつのスロットの定義に複数指定することはできませんので、 エラーが発生します。

もし、あるスロットにreader, writer, accessorが指定されていないとき、 そのスロットはただslot-valueによってのみアクセスできます。

もしdefclassフォームがトップレベルに現れたとき、 コンパイラーはクラス名を有効な型の名前であると認識し、 後続の宣言(たとえばdeftype)や、 defmethodの特定パラメーター、 またdefclass:metaclassオプションでも使用できるようにしなければならない。 コンパイラーは、find-classの環境の引数に、 マクロの環境パラメーターで受け取った値を指定したときは、 クラスの定義を返却できるようにしなければならない。

例文

なし。

影響

なし。

例外

もしスロットの名前に重複があった場合は、 型program-errorのエラーが発生します。

もし、クラスオプション:default-initargsに 初期化引数の名前が複数現れたときは、 型program-errorのエラーが発生します。

もし、スロットオプション :allocation, :initform, :type, :documentationが ひとつのスロットの定義に複数現れたときは、 型program-errorのエラーが発生します。

すべての実装は、自身が実装していない クラスオプションやスロットオプションを見た場合は、 型program-errorのエラーが通知することを要求されています。

参考

documentation, initialize-instance, make-instance, slot-value, 4.3. クラス, 4.3.4. 継承, 4.3.6. クラスの再定義, 4.3.5. クラス優先順位リストの決定, 7.1. オブジェクトの作成と初期化

備考

なし。


TOP, Github