% 7.5.2. スロットへのアクセス
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を実行します。