是否存在可设置的nthcdr实现?

时间:2010-12-08 13:27:52

标签: lisp common-lisp clisp

我正在使用clisp,我想知道是否有任何可以使用nfcdr的可设置版本的库。

2 个答案:

答案 0 :(得分:5)

您可以通过以下方式解决问题:

(let ((lst (list 1 2 3 4))
      (n 2))
  (setf (cdr (nthcdr (1- n) lst)) '(5 6 7))
  l)
> (1 2 5 6 7)

或者为它定义自己的setf:

;; !!warning!!  only an example, lots of nasty edge cases
(defsetf nthcdr (n lst) (new-val) 
   `(setf (cdr (nthcdr (1- ,n) ,lst)) ,new-val))

我不知道为什么nthcdr没有定义setf。甚至Alexandria似乎也为最后一个定义了setf,而不是nthcdr。

PS。我想把你的nthcdr设置为代码中的难闻气味。

答案 1 :(得分:1)

(defsetf my-nthcdr (n list) (store)
  (let ((tmp (gensym)))
    `(let ((,tmp (nthcdr (1- ,n) ,list)))
       (rplacd ,tmp ,store)
       (cdr ,tmp))))

当n为0时不起作用,当LIST为符号时可以使其工作,在宏扩展时检查N是否为零,但是只有当N是数字或包括检入时它才有效扩展代码。