В LISP у меня есть функция, которой передается список. Я хотел бы изменить элемент этого списка без изменения исходного списка. Обычно я бы использовал copy-list
для создания локальной копии списка, которую я изменю, но это, похоже, не работает:
CL-USER> (defun test (item)
(let ((copy (copy-list item)))
(setf (nth 0 (nth 0 (nth 0 copy))) t)
(print item)
(print copy)))
CL-USER> (defparameter item `(((NIL NIL) (NIL NIL) (NIL NIL))
((NIL NIL NIL) (NIL NIL NIL))
((3 3) (NIL NIL))))
CL-USER> (test item)
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
CL-USER> item
(((T NIL) (NIL NIL) (NIL NIL)) ((NIL NIL NIL) (NIL NIL NIL)) ((3 3) (NIL NIL)))
Как видите, значение item
было изменено на test
, хотя я скопировал список в локальную переменную и изменил локальную копию. Похоже, это симптом использования nth
. Если я использую один вызов car
, а не повторный вызов nth
, функция работает, как и ожидалось, и item
после вызова не меняется.
Почему nth
ведет себя так и как я могу продолжать использовать nth
без изменения значения, переданного test
?
Я использую Common Lisp.