replace - 在 LISP 中修改/替换

标签 replace find lisp

我有一个名为修改列表的函数的实现,如下所示,但它仅适用于顶级列表。

(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)))

基本上,如果 xold<,则只需返回 new,而不是假设 x 必须是一个列表(实际上是一棵树),如果它是一个列表,则递归映射,否则返回 x 不变...

使用这种方法也可以(modify 'a 'x 'a) --> X(IMO 似乎是正确的)。

关于replace - 在 LISP 中修改/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898529/

相关文章:

javascript - String.Replace() 的小问题

SQL Server : How do you remove punctuation from a field?

linux - GNU 找到 : when does the default action apply?

c++ - 在 C++ 中,如何提取文本文件的 ExtractFilePath

javascript - js检查元素是否在数组中

Emacs, evil-mode : Replace only in visual selection/visual block?

javascript - 如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

lisp - 检查整数是否大于、小于或等于的过程

lisp - 在 LISP 中写入与写入行

LISP cdr 函数