我正在使用clisp,我想知道是否有任何可以使用nfcdr的可设置版本的库。
答案 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是数字或包括检入时它才有效扩展代码。