我正在尝试在 elisp 中实现我自己的深拷贝例程(因为类似的东西(setq newlist oldlist)
似乎只给出了一个浅拷贝,并且(copy-sequence newlist oldlist)
仍然newlist
暴露于元素的任何变化oldlist
)
此外,如果有一个功能可以满足我的需求,我将无法找到它。
我的函数的定义是:
(defun deep-copy (iList oList)
(setq oList (car iList))
(setq counter (- (length iList) 1))
(setq iList (cdr iList))
(while (> counter 0)
(setq oList (cons oList (car iList)))
(setq iList (cdr iList))
(setq counter (- counter 1) )))
之后,发生iList
的(1 2 3 4 5 6)
事情oList
是:(((((1 . 2) . 3) . 4) . 5) . 6)
即嵌套列表。
我尝试过引用、反引用、使用附加、切换oList
和(car iList)
in的顺序(cons # #)
、谷歌搜索解决方案,但我没有运气(错误或垃圾)。
除了对已经存在的可以执行我想要的功能的欢迎评论,代码中存在弱点的地方(我是 elisp 新手),有人可以告诉我如何正确地将元素添加到现有列表中吗?
这些示例往往是以下形式的变体:(cons 'pine '(fir oak maple))
,其中'(fir oak maple)
是一些硬编码列表
编辑:在过去的两个小时里,我一直在与自己作斗争(因为我在调用函数中注释掉了 oList,并且我一直在引用它的旧版本)。无论如何,最后交换oList
然后(car iList)
反转似乎可以解决问题(但肯定有更好的方法!?)即
(defun deep-copy (iList)
(setq oList nil )
(setq counter (- (length iList) 1))
(while (>= counter 0)
(setq oList (cons (car iList) oList) )
(setq iList (cdr iList) )
(setq counter (- counter 1) ))
(reverse oList)
)