为什么下面的lisp代码没有给出期望的结果

为什么下面的lisp代码没有给出期望的结果,lisp,Lisp,我有一张单子 '((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F))) 我想处理内部列表中的元素,在本例中,我想将abc和其他列表更改为M 我编写了一个代码进程lst,它将为内部列表执行此任务 (defun process (lst) (cond ((null lst) '()) (T (cons 'M (process (cdr last)))))) 当我从主函数调用时 (defun iterate-list (lst) (cond

我有一张单子

'((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F)))
我想处理内部列表中的元素,在本例中,我想将abc和其他列表更改为M

我编写了一个代码进程lst,它将为内部列表执行此任务

(defun process (lst)
  (cond
    ((null lst) '())
    (T (cons 'M (process (cdr last))))))
当我从主函数调用时

(defun iterate-list (lst)
  (cond
    ((null lst) '())
    ((listp (car lst)) 
     (cons (process (car lst)) 
           (iterate-list (cdr lst))))
    (T 
     (cons (car lst) 
           (iterate-list (cdr lst))))))
我得到的是M,而不是1,2,3,4,5,M

但是当我使用相同的函数时,在第二个条件listp car lst中使用cons car lst iterate list cdr lst,我得到了正确的答案,即

'((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F)))

我不知道我在哪里犯了错误。

如果您想要一些实用的东西,我建议使用公共LISP标准库中的subst函数


您还可以通过将变量subst if与lambda函数一起使用来添加自己的相等函数。

如果您想要一些实用的东西,我建议使用公共LISP标准库中的subst函数

您还可以使用变量subst if和lambda函数来添加自己的相等函数。

NB。您需要将last重命名为进程中的lst

我得到的是M,而不是1,2,3,4,5,M

代码可以工作,但不能达到您想要的深度:

(process '(a b c d))
=> (M M M M)

(iterate-list '(1 2 (A B C)))
=> (1 2 (M M M))
要处理根列表中的所有列表,可以执行以下操作:

(mapcar #'iterate-list '((1 2 (A B C))
                         (2 3 (B C D))
                         (4 5 (C D F))))

=> ((1 2 (M M M)) (2 3 (M M M)) (4 5 (M M M)))
注意。您需要将last重命名为进程中的lst

我得到的是M,而不是1,2,3,4,5,M

代码可以工作,但不能达到您想要的深度:

(process '(a b c d))
=> (M M M M)

(iterate-list '(1 2 (A B C)))
=> (1 2 (M M M))
要处理根列表中的所有列表,可以执行以下操作:

(mapcar #'iterate-list '((1 2 (A B C))
                         (2 3 (B C D))
                         (4 5 (C D F))))

=> ((1 2 (M M M)) (2 3 (M M M)) (4 5 (M M M)))

你说我得到了正确的答案,但列表与输入列表相同,这是打字错误吗?对不起,这不是打字错误。在简单的迭代中,我能够迭代列表中的单个原子和列表项。我正在做两个cons,一个是listp,另一个是T。我想修改listp条件的cons。你说我得到了正确的答案,但列表与输入列表相同,这是一个拼写错误吗?对不起,这不是一个拼写错误。在简单的迭代中,我能够迭代列表中的单个原子和列表项。我正在做两个cons,一个用于listp,另一个用于T。我想修改listp条件的cons。回答得好,也许你可以为OP的情况添加一个示例,例如,用“M”替换树中的所有符号?谢谢链接。我在找这个,但在网站上找不到。我的不好。我可以同时使用这两个答案,但不能同时选择这两个作为正确答案。答案很好,也许你可以为OP的案例添加一个例子,例如用“M”替换树中的所有符号?谢谢链接。我在找这个,但在网站上找不到。我的错。我可以同时使用这两个答案,但不能同时选择这两个作为正确答案。对不起,上一个是由Grammarly自动更正的。我在很多地方进行了更正,但错过了这一个。这正是我要找的答案。对不起,最后一个是语法自动更正。我在很多地方都改正了,但错过了这一个。这正是我想要的答案。