List 如何在没有映射的情况下在Lisp中创建子列表?

List 如何在没有映射的情况下在Lisp中创建子列表?,list,recursion,lisp,sublist,List,Recursion,Lisp,Sublist,我试图创建一个函数,创建给定列表中所有子列表的列表 我的意思是,当我有一张清单: (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

我试图创建一个函数,创建给定列表中所有子列表的列表


我的意思是,当我有一张清单:

(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))
似乎不起作用,我找不到我的错误。

如果是这样,你可以写:

(defun unterlisten-zurueckgeben (lst)
    (remove-if-not #'listp lst))
 ; or use #'consp if you don't want empty sublists
请注意,在Lisp中,组合标识符的首选方法是使用破折号而不是下划线。

如果是这样,您可以编写:

(defun unterlisten-zurueckgeben (lst)
    (remove-if-not #'listp lst))
 ; or use #'consp if you don't want empty sublists

请注意,在Lisp中,组合标识符的首选方法是使用破折号而不是下划线。

因此您只希望保留子列表。您可以通过以下方式轻松做到这一点:

(去除原子(lst)
(如果#'原子lst)移除)
在递归代码中,存在以下问题:

(或(unterlisten_zurueckgeben(第一个lst))
(setq unterlisten(cons)(第一个lst)
(unterlisten_zurueckgeben(其余第1()()())))
这里,如果
(unterlisten_zurueckgeben(first lst))
的结果不是一个空列表(例如一个带有列表的列表),那么它将是整个事件的结果

如果不是
nil
,则将local绑定
underlisten
更改为正常结果

因为
cond
不是尾部表达式。函数的结果始终是
underlisten
的内容。因此,对于仅与列表的其余部分一起递归的默认情况,结果永远不会返回,因为它将返回
nil
underlisten
的初始值)

因此,即使您自己的解决方案也远比它需要的复杂:

(去除原子(lst)
(续)(完)无)
((列表P(第一个lst))
(cons(第一个lst)(移除原子(其余lst)))
(t(除去原子(其余的lst(()))))

所以您只想保留子列表。您可以通过以下方式轻松做到这一点:

(去除原子(lst)
(如果#'原子lst)移除)
在递归代码中,存在以下问题:

(或(unterlisten_zurueckgeben(第一个lst))
(setq unterlisten(cons)(第一个lst)
(unterlisten_zurueckgeben(其余第1()()())))
这里,如果
(unterlisten_zurueckgeben(first lst))
的结果不是一个空列表(例如一个带有列表的列表),那么它将是整个事件的结果

如果不是
nil
,则将local绑定
underlisten
更改为正常结果

因为
cond
不是尾部表达式。函数的结果始终是
underlisten
的内容。因此,对于仅与列表的其余部分一起递归的默认情况,结果永远不会返回,因为它将返回
nil
underlisten
的初始值)

因此,即使您自己的解决方案也远比它需要的复杂:

(去除原子(lst)
(续)(完)无)
((列表P(第一个lst))
(cons(第一个lst)(移除原子(其余lst)))
(t(除去原子(其余的lst(()))))

不清楚“列表中的子列表”是什么意思。你应该提供一个例子。我的意思是,当我有一个列表时:
(4(agb)g(123)g(456))
我想要一个列表:
((agb)(123)(456))
不清楚你所说的“列表中的子列表”是什么意思。你应该提供一个例子。我的意思是,当我有一个列表:
(4(a g b)g(1 2 3)g(4 5 6))
我想要一个列表:
((a g b)(1 2 3)(4 5 6))
思考了很长时间后,我意识到,虽然这也是第二个答案,是我问题的答案,答案对我的大局没有帮助,因为我提出的问题不是什么可以帮助我解决我的整体问题。@EviLGaMer现在,这就是所谓的a(即,不是提出你的实际问题,而是提出一个与可能的解决方案相关的问题)在经过长时间的艰苦思考后,用三行代码完成了我试图做的事情。我想做的是编写一个函数,尽可能简化以子列表形式编写的算术表达式,即aka
(+35(-7 4)x 8 9(*3 5 f))
。思考了很长时间后,我意识到这一点以及第二个答案就是我问题的答案,答案对我的大局没有帮助,因为我提出的问题不是什么可以帮助我解决我的整体问题。@EviLGaMer现在,这就是所谓的a(即,不是提出你的实际问题,而是提出一个与可能的解决方案相关的问题)在经过长时间的艰苦思考后,用三行代码完成了我试图做的事情。我想做的是编写一个函数,它将尽可能简化一个算术表达式,该表达式用子列表aka
(+35(-74)x89(*35f))
写成一个列表。