Существует ли реализация SETFABLE NTHCDR?
-
10-10-2019 - |
Вопрос
Я использую Clisp, и мне интересно, есть ли библиотека с установленной версией NTHCDR, которую я могу использовать.
Решение
Вы можете взломать это с помощью:
(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. Даже Александрия кажется, определяет SETF для последнего, но не NTHCDR.
Пса Я бы рассматривал желание установить NTHCDR как неприятный запах в вашем коде.
Другие советы
(defsetf my-nthcdr (n list) (store)
(let ((tmp (gensym)))
`(let ((,tmp (nthcdr (1- ,n) ,list)))
(rplacd ,tmp ,store)
(cdr ,tmp))))
Не работает, когда n равен 0, вы можете заставить его работать, когда список является символом, проверяя, будет ли n нулевым либо по времени макроэлексии, но тогда он работает, только если n - это число, или включать проверку в расширенном коде. Анкет
Не связан с StackOverflow