我有一个数据结构,这是一个列表列表,并不重要。
(setf var1 create_data_Structure)
现在我需要在数据结构中插入一个值来测试没有修改var1的东西。
(defun testsomething(data_str val)
(let ((data_str_aux data_str))
(progn (insert val data_str_aux)
(testData data_str_aux))))
好吧,我对函数的其余部分做了什么并不重要,但现在如果我写这个:
>var1
看来我的数据结构里面有值,但我不想这样做。 我也尝试了这个:
(defun testsomething(data_str val)
(let ((data_str_aux))
(progn (setq data_str_aux data_str)
(insert val data_str_aux)
(testData data_str_aux))))
它仍然会改变我的全球结构。你会做什么?
答案 0 :(得分:2)
在您的情况下,aux
只是对内存中同一对象的额外引用,因此使用insert
修改它会修改同一个对象。
您需要的是
(defun test-something (data-str val)
(let ((aux (copy-my-structure data-str)))
(insert val aux)
(test-data aux)))
如,
(defparameter var1 (list 1 2 3 4))
(defun copy-my-structure (str)
(copy-list str))
(defun insert (val str) ; assumes non-NIL str
(nconc str (list val)))
(defun test-data (data)
(list (every #'numberp data)
(length data)))
(test-something var1 7)
==> (T 5)
var1
==> (1 2 3 4)