【发布时间】:2014-03-18 23:19:56
【问题描述】:
我是 lisp 的新手,我正在尝试编写一个函数,它将带有子列表(例如 (1 2 (3 (4)) 5) 的列表变成这样的列表 (1 2 3 4 5) )。问题是,我不知道如何在一个条件下放置 2 个订单。例如这是我的代码
(defun Func1 (x y)
(cond
((null x) y)
((listp (CAR x)) (Func1 (CDR x) (append y (CAR x) )) )
(T (Func1 (CDR x) (CONS (CAR x) y) ) ) ) )
好吧,我知道我需要更改第二个条件,所以如果 x 的第一个元素是一个列表,那么我将调用相同的函数,如 (Func1 (CAR x) y) 但如果我这样做,我会只获得子列表的项目,我将失去列表的另一部分。所以基本上,我的问题是,我如何告诉 LISP 在它完成这一行之后
((listp (CAR x)) (Func1 (CDR x) (append y (CAR x) )) )
它应该继续执行另一行
(T (Func1 (CDR x) (CONS (CAR x) y) ) ) ) )
【问题讨论】:
-
这通常称为扁平化列表,有lots of questions on Stack Overflow about flattening lists。如果您浏览他们的代码,您可能会找到您需要的结构。但是,这个问题中的代码格式很难说出您尝试编写的内容,并且不太清楚您在问什么。
-
接受
(1 2 (3 (4)) 5)并返回(1 2 3 4 5)的函数几乎可以肯定是 one 参数的函数(要展平的列表),但您正在编写一个函数两个参数,x和y。x和y应该是什么(命名不清楚)?y应该是一种累加器,因此您最初会调用类似(func1 (1 2 (3 (4)) 5))的东西。如果是这种情况,我们真的需要更多地描述您正在尝试编写的内容,以及哪些内容不起作用。 -
我使用 y 作为一个空列表,我将从中返回结果。