我有一个名为修改列表的函数的实现,如下所示,但它仅适用于顶级列表。
(defun modify-list (old new a-list)
(cond
((null a-list) nil)
((eql (car a-list) old) (cons new (modify-list old new (cdr a-list))))
(T (cons (car a-list)(modify-list old new (cdr a-list))))))
CL-USER 16 : 6 > (修改列表 'a 'x '(p a d g c a)) (P X D G C X) <-- 好!
CL-USER 17 : 6 > (修改列表 'a 'x '(p a d (g a) c a)) (P X D (G A) C X) <----不好!
谁能帮我让这个函数在嵌套列表上工作?
最佳答案
为什么不在更高的层次上工作呢?这将使代码更简单......
(defun modify (old new x)
(cond
((eq x old) new)
((listp x)
(mapcar (lambda (y) (modify old new y)) x))
(t x)))
基本上,如果 x
是 old<,则只需返回
,如果它是一个列表,则递归映射,否则返回 new
,而不是假设 x
必须是一个列表(实际上是一棵树)x
不变...
使用这种方法也可以(modify 'a 'x 'a) --> X
(IMO 似乎是正确的)。
关于replace - 在 LISP 中修改/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898529/