7.5.2. スロットへのアクセス
スロットは次の2つの方法にてアクセスできます。 関数slot-value
を使用する方法、 そしてdefclass
フォームによって生成されるジェネリック関数を使用する方法です。
関数slot-value
は、 defclass
フォームで対象のクラスのインスタンスにて アクセス可能に設定したスロットに対しては、 どんなスロットの名前でも指定してアクセスすることができます。
マクロdefclass
は、スロットの読み書きをするメソッドを生成するための構文が提供されています。 もしreader
のメソッドが要求された場合、 スロットの値を読むためのメソッドが自動的に生成されますが、 ただし値を格納するためのメソッドは生成されません。 もしwriter
のメソッドが要求された場合、 スロットの値を書き込むためのメソッドが自動的に生成されますが、 ただし値を読み込むためのメソッドは生成されません。 もしaccessor
のメソッドが要求された場合は、 スロットの値を読むためのメソッドと、 スロットの値を書き込むためのメソッドが自動的に生成されます。 reader
とwriter
のメソッドは、slot-value
を使用して実装されます。
スロットに対してreader
かwriter
のメソッドを指定するときは、 ジェネリック関数の名前とそれに沿って生成されるメソッドの名前を直接指定します。 もしwriter
メソッドの名前をシンボルname
に指定した場合、 スロットへ書き込むためのジェネリック関数の名前がシンボルname
となり、 そのジェネリック関数の引数は、 新しい値、インスタンスの順に2つ取ります。 もしaccessor
メソッドの名前をシンボルname
に指定した場合、 スロットから読み込むためのジェネリック関数の名前がシンボルname
となり、 そしてスロットへ書き込むためのジェネリック関数の名前が、リストの(setf name)
となります。
スロットオプションの:reader
, :writer
, :accessor
の指定により、 作成か修正が行われたジェネリック関数は、 正確に普通のジェネリック関数として扱うことができます。
注意として、slot-value
はスロットから値を読み込むか書き込む時に使われますが、 そのスロットのreader
かwriter
のメソッドが存在するかどうかに関わらず使用できます。 slot-value
が使われる時、reader
かwriter
のメソッドは実行されません。
マクロwith-slots
は、 指定されたスロットがレキシカル変数として使えるようにするレキシカル環境を確立します。 マクロwith-slots
は、指定したスロットへアクセスするために関数slot-value
を実行します。
マクロwith-accessors
は、 指定したスロットがレキシカル変数としてスロットのaccessor
を通して 使えるようにするレキシカル環境を確立します。 マクロwith-accessors
は、指定したスロットへアクセスするために、 適切なaccessor
を実行します。