如何创建一个新列表指向其他地方,Lisp

时间:2009-11-14 15:30:38

标签: list pointers memory lisp memory-address

标题不言自明。如何从另一个列表Y(相同的结构)构建一个新的列表X,但结果列表指向内存区域的其他位置,实际上是另一个对象?我尝试使用make-list :initial-element Y或附加到空列表,但我仍然得到相同的对象。谢谢!

3 个答案:

答案 0 :(得分:12)

Common Lisp

使用 COPY-LIST 复制第一个列表级别。

使用 COPY-TREE 复制一个圆锥树,将在所有级别复制多级列表。

COPY-TREE和COPY-LIST都只会复制这些内容而不会复制其他内容。列表中的内容保持不变(意味着EQL,而不是EQ)。

有关这些及相关功能,请参阅Common Lisp HyperSpec的The Conses Dictionary

答案 1 :(得分:3)

您可能想要使用COPY-LIST。

答案 2 :(得分:0)

我的副本列表(使用sbcl)有效。

REPL:

(defvar a '((1 2 3) (4 5 6)))

(defvar b (copy-tree a))

(setf (nth 0 (nth 0 b)) "4")

a

; ((1 2 3) (4 5 6)) is returned

b

;(("4" 2 3) (4 5 6)) is returned

也许如果你给我们更多的消息来源,我们可以提供帮助。