我试图创建一个函数来创建给定列表中所有子列表的列表。
我的意思是,当我有一个清单:
(4 (a g b) g (1 2 3) g (4 5 6))
我想要一份清单:
((a g b) (1 2 3) (4 5 6))
我现在得到的是:
(defun unterlisten_zurueckgeben (lst)
(let (unterlisten)
(cond ((endp lst) nil)
((listp (first lst))
(or (unterlisten_zurueckgeben (first lst))
(setq unterlisten (cons (first lst) (unterlisten_zurueckgeben (rest lst))))))
(t (unterlisten_zurueckgeben (rest lst))))
unterlisten))
好像没用,我找不到我的错误。
最佳答案
所以你只想保留子列表你可以通过remove-if
轻松做到这一点:
(defun remove-atoms (lst)
(remove-if #'atom lst))
在递归代码中,存在以下问题:
(or (unterlisten_zurueckgeben (first lst))
(setq unterlisten (cons (first lst)
(unterlisten_zurueckgeben (rest lst))))))
在这里,如果
(unterlisten_zurueckgeben (first lst))
的结果不是空列表(例如带有列表的列表),那么它将是整个事情的结果。如果不是
nil
,则将本地绑定underlisten
更改为似乎正常的结果。因为
cond
不是尾部表达式函数的结果总是无论underlisten
是什么因此,对于只与列表的其余部分一起递归的默认情况,不会返回结果,因为它将返回nil
(初始值underlisten
)。因此,即使是递归滚动,您自己的解决方案也比需要的复杂得多:
(defun remove-atoms (lst)
(cond ((endp lst) nil)
((listp (first lst))
(cons (first lst) (remove-atoms (rest lst))))
(t (remove-atoms (rest lst)))))
关于list - 如何在没有 map 的Lisp中创建子列表的列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30207552/