使用DEFSETF

时间:2018-02-25 19:47:54

标签: lisp common-lisp

从标准描述中理解起来真的很难,所以:

例如,我正在尝试将某个列表(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使用这些。求助。

1 个答案:

答案 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的一个特例:在现实生活中,你不需要写任何一个。)