我试图创建一个函数来创建给定列表中所有子列表的列表。
我的意思是,当我有一个清单:

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

10-11 22:02
查看更多