從這個問題引發了關於SETF擴展:defining setf-expanders in Common LispCommon Lisp的:方法定義SETF擴展時,儘量減少重複代碼
當編寫用戶定義的干將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>
注(汽車LST)的形式,在已定義一個SETF擴展的實際訪問,如何在這兩個defuns。這一直讓我有些惱火。能夠在第一個defun上說出'是好的,'嘿,我正在定義一個defun,這是一個吸氣,但我也希望它有一個典型的setf擴張器'。
用普通的lisp標準來表達這個嗎?有沒有其他人擔心這個問題,並定義了一個這樣做的宏?
爲了清楚起見,我想在這裏定義一個getter和典型的setter,其中getter編譯到已經有setter(例如car lst)的通用lisp窗體的方式是隻在代碼中寫過一次。
我也明白有些時候你不想這樣做,B/C設置者需要在設置值之前執行一些副作用。或者它是一個實際設置多個值或其他值的抽象。這個問題在那種情況下不那麼重要。我在這裏談論的是這樣一種情況,即制定者做標準事情,並設定獲取者的位置。
是的;這有效;我會稍微等一下,看看我是否有其他的實現。 – 2012-07-14 05:50:06