我认为从这段代码中可以明显看出我要做的是,将'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)
;
现在,如果不使用我自己的函数
getsecondof
和setf
来传递一个内置的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