質問
CLOSの「スロット」についてCL'erから説明してください。スロット名の後の部分を理解するのが難しいと感じています。それは:
(defclass foo() (data1:initarg foo))
「initarg」などの類似の意味は何を意味しますか?マニュアルを読み直しています。ですから、ここの誰かが私のような素人に説明できたら本当にありがたいです。
ありがとう!
解決
あなたの例は少し間違っています。次のようにする必要があります。
(defclass foo ()
((data1 :initarg foo)))
追加された括弧に注意して、スロットの説明のリストを示します。
DEFCLASSはスロットのリストを受け取ります。したがって、2つのスロットがあります:
(defclass foo ()
((data1 :initarg :data1arg
:initform (random 1.0)
:type number
:documentation "doc here"
:accessor foo-data1-acc)
(data2 :initarg :data2arg)))
DATA1はスロットの名前です。その背後に、キーワード値のペアがあります。
:INITARGは、MAKE-INSTANCEのパラメーターが何であるかを示します。 (make-instance 'foo:data1arg 10);オブジェクトを作成し、スロットdata1を10に設定します。 通常、キーワードシンボル(ここでは:data1argなど)を使用する必要があります。
:INITFORMは、オブジェクトの作成時にデフォルトでスロットを設定します。のように: (make-instance 'foo);オブジェクトを作成します。スロットは、initformの値に設定されます。
:TYPEは、スロットのオブジェクトのタイプを指定します。
:DOCUMENTATIONは、ドキュメントの単なる文字列です。
:ACCESSORは、スロットを読み書きする関数を指定します。
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
任意の順序でペアを記述でき、複数のアクセサー関数を指定することもできます。 :READERおよび:WRITER関数もあります。
CLOSを使用すると、DEFCLASSマクロ内ですべてを指定できます。これらのものはdefstructのように自動的に生成されません。defstructの方が短い表記です。
DEFCLASSの説明は次のとおりです: DEFCLASS 。 短いCLOSイントロ。
他のヒント
スロット仕様では、一般的な構文は( slot-name [ slot-option option-value ] ...)です。基本的に著者の参照は、 defclassのHyperSpecページです。要するに:
:reader スロットの値を読み取る関数
:writer スロットの値を書き込む関数
:accessor スロットの値を読み取り、(SETFを介して)設定する機能
:initarg MAKE-INSTANCEからスロットの値を設定するシンボル
他にもありますが、そのリストは私が主に使用している4つです(実際、主に:initargと:accessorまたは:readerのいずれかを使用しています)。