为什么下面的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自动更正的。我在很多地方进行了更正,但错过了这一个。这正是我要找的答案。对不起,最后一个是语法自动更正。我在很多地方都改正了,但错过了这一个。这正是我想要的答案。