setf expanders に関するこの質問からトリガーされました: Common Lisp での setf-expanders の定義
ユーザー定義ゲッターの setf エクスパンダーを作成する場合、プロパティの取得方法に関する限り、ゲッターとセッターにコードの重複があることがよくあります。例えば:
CL-USER>
(defun new-car (lst)
(car lst))
NEW-CAR
CL-USER>
(defun (setf new-car) (new-value lst)
(setf (car lst) new-value))
(SETF NEW-CAR)
CL-USER>
(defparameter *lst* (list 5 4 3))
*LST*
CL-USER>
*lst*
(5 4 3)
CL-USER>
(setf (new-car *lst*) 3)
3
CL-USER>
*lst*
(3 4 3)
CL-USER>
(car lst) 形式、setf エキスパンダーが既に定義されている実際のアクセサーが両方の defun にあることに注意してください。これはいつも私をいくらか悩ませてきました。最初の defun で、「getter である defun を定義していますが、典型的な setf エクスパンダも必要です」と言うことができればよいでしょう。
これを表現するための一般的なLisp標準を使用する方法はありますか? 他の誰かがこの問題を心配して、これを行うマクロを定義しましたか?
明確にするために、ここで私が望むのは、ゲッターと典型的なセッターを定義する方法です。ここで、ゲッターが既にセッターを持っている一般的な Lisp フォーム ((car lst) など) にコンパイルされる方法は、コード。
また、これを行いたくない場合があることも理解しています。b/c セッターは、値を設定する前にいくつかの副作用を実行する必要があります。または、実際に複数の値を設定する抽象化などです。この質問は、その状況では関連性が低くなります。ここで話しているのは、setter が標準的なことを行い、getter の場所を設定するだけの場合です。