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))
写成一个列表。