gpt4 book ai didi

common-lisp - 如何复制列表而不是共享结构?

转载 作者:行者123 更新时间:2023-12-04 03:09:52 24 4
gpt4 key购买 nike

哇,我完全不明白这一点!

我有一个列表, L1 。我想复制 L2 ,这样当我修改 L2 时, L1 保持不变。我想这就是 copy-seq 的用途,但它的行为不像预期的那样。

(defun tcopy ()
(let ((seq1 nil)
(seq2 nil))
(setf seq1 (list (list 11 22) (list 33 44 55)))
(setf seq2 (copy-seq seq1))
(format t "before -- s1: ~a s2: ~a~%" seq1 seq2)
(setf (nth 1 (nth 1 seq2)) 99)
(format t "after -- s1: ~a s2: ~a~%" seq1 seq2)))

和输出:
? (tcopy)
before -- s1: ((11 22) (33 44 55)) s2: ((11 22) (33 44 55))
after -- s1: ((11 22) (33 99 55)) s2: ((11 22) (33 99 55)) ; Undesired: s1 is modified
NIL
?

我还尝试了以下方法:
;(setf seq2 (copy-seq seq1))
(setf seq2 (reduce #'cons seg1 :from-end t :initial-value nil))

它给出了相同的结果。 Lisp-n00b,这里;我错过了什么?!

谢谢!

最佳答案

COPY-SEQ 只复制顶层序列。没有任何子序列。 ( COPY-LIST 的行为方式相同。)

COPY-TREE 复制一棵 cons 细胞树。因此,它还将复制列表列表的列表......

关于common-lisp - 如何复制列表而不是共享结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com