Вопрос

Я использую 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 - это число, или включать проверку в расширенном коде. Анкет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top