同じスロットに読み書きできるアクセサと読み出し専用のアクセサをつけたい - lisp-cookbook-ja/common-lisp GitHub Wiki

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

同じスロットに読み書きできるアクセサと読み出し専用のアクセサをつけたい

defclassの定義で一つのスロットに複数のアクセサを記述することが可能です。 また、総称関数を別に定義することでも可能です。

(defclass foo ()
  ((x :initform 42
      :accessor foo-accessor
      :reader foo-reader)))

(defparameter *obj* (make-instance 'foo))

(foo-reader *obj*)
;=> 42
(setf (foo-accessor *obj*) 100)

(foo-accessor *obj*)
;=> 100

(setf (foo-reader *obj*) 200)
;-> error The function (SETF FOO-READER) is undefined.