Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp 在结构中插入值以进行测试,而不修改结构_Lisp_Common Lisp - Fatal编程技术网

Lisp 在结构中插入值以进行测试,而不修改结构

Lisp 在结构中插入值以进行测试,而不修改结构,lisp,common-lisp,Lisp,Common Lisp,我有一个数据结构,它是一个列表列表,其实并不重要 (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

我有一个数据结构,它是一个列表列表,其实并不重要

(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))))

它仍然在改变我的全球结构。您会怎么做?

在您的情况下,
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)