将值插入到结构中进行测试而不修改结构

时间:2014-11-07 13:22:03

标签: 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_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))))

它仍然会改变我的全球结构。你会做什么?

1 个答案:

答案 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)