インスタンス変数へアクセスするメソッドを簡単に定義する - lisp-cookbook-ja/common-lisp GitHub Wiki

オブジェクトシステム(CLOS)

インスタンス変数へアクセスするメソッドを簡単に定義する

defclass でのクラスの定義では :reader(読み出し専用)、 :writer(書き込み専用)、 accessor(読み書き)を指定することにより総称関数(メソッド)も一緒に定義できます。

(defclass sample-class ()
  ((a :initform 0 :reader a)     ;aというリーダを設定
   (b :initform 0 :writer b)     ;bというライタを設定
   (c :initform 0 :accessor c))) ;cというアクセサを設定

(let ((inst (make-instance 'sample-class)))
  (b 10 inst)                    ;bメソッドでbスロットに10を設定
  (setf (c inst) 100)            ;cメソッドでcスロットに100を設定
  
  (describe inst))
;-> Instance: #<SAMPLE-CLASS {4002406CD2}>
;   Class: #<STANDARD-CLASS SAMPLE-CLASS {40036857E2}>
;    The following slots have :instance allocation:
;     A   0
;     B   10
;     C   100