从标准描述中理解起来真的很难,所以:
例如,我正在尝试将某个列表(ls)的第k个位置设置为特定值。即使有我自己的功能,也可以访问第k个elt。
(defun kth-elt (lst k)
(cond ((> 0 k) nil)
((equal 0 k) (car lst))
((< 0 k) (kth-elt (cdr lst) (- k 1))))).
还创建了一个更新该值的函数。
(defun kth-upd (lst k new)
(cond ((> 0 k) nil)
((equal 0 k) (setf (car lst) new))
((< 0 k) (kth-upd (cdr lst) (- k 1) new))))
现在我可以实际使用它,但我想了解它和DEFSETF之间的区别。我还是不明白。如何“教”defsetf使用这些。求助。
答案 0 :(得分:1)
作为coredump答案的附录,值得注意的是以下作品,并且在我看来,比使用defsetf
要好得多:
(defun kth-elt (lst k)
(cond ((> 0 k) nil)
((= 0 k) (car lst))
((< 0 k) (kth-elt (cdr lst) (- k 1)))))
(defun (setf kth-elt) (new lst k)
(cond ((> 0 k) nil)
((= 0 k) (setf (car lst) new))
((< 0 k) (setf (kth-elt (cdr lst) (- k 1)) new))))
有些情况下,您需要defsetf
,但它们并不常见。
(kth-elt
本身只是elt
的一个特例:在现实生活中,你不需要写任何一个。)