我认为从这段代码中可以明显看出我要做的是,将'blue更改为'purple

CL-USER> (defparameter myassoc '((color red blue) (shape circle square)))
MYASSOC
CL-USER> myassoc
((COLOR RED BLUE) (SHAPE CIRCLE SQUARE))
CL-USER> (defun getsecondof (assoc) (second (rest (assoc assoc myassoc))))
GETSECONDOF
CL-USER> (getsecondof 'color)
BLUE
CL-USER> (setf (getsecondof 'color) 'purple)
; in: SETF (GETSECONDOF 'COLOR)
;     (FUNCALL #'(SETF GETSECONDOF) #:NEW954 'COLOR)
; ==>
;   (SB-C::%FUNCALL #'(SETF GETSECONDOF) #:NEW954 'COLOR)
;
; caught STYLE-WARNING:
;   undefined function: (SETF GETSECONDOF)
;

现在,如果不使用我自己的函数getsecondofsetf来传递一个内置的CL表达式来提取我想要更改的位置,它就可以工作了。
是否可以使用自定义getter作为setf的setter?

最佳答案

您需要为它定义一个setf

(defun (setf getsecondof) (assoc value)
  (setf (caddr (assoc assoc myassoc)) value)) ; (caddr x) == (second (rest x))

(setf (getsecondof 'color) 'purple) ; ==> PURPLE
(getsecondof 'color) ; ==> PURPLE

09-11 19:23