如何避免NIL被添加到列表中?

时间:2014-04-14 12:36:56

标签: lisp

我是lisp的新手。我已经在lisp中写了一个flatten函数。

(defun flatten (list)
  (cond ((null list) nil)
        ((atom (first list))
         (cons (first list) (flatten (rest list))))
        (t (append (flatten (first list)) (flatten (rest list))))))

INPUT- (flatten '(a () b (c d)))

预期的输出 - (a b c d)

我的输出 - (a nil b c d)

我该怎么做才能避免' nil'从添加到列表?我应该做一个递归函数。

3 个答案:

答案 0 :(得分:1)

(atom nil) ; ==> T当然,因为()nil,你需要制作一个新的基础案例,只有在它没有时才能进行递归而不是消失。

答案 1 :(得分:1)

你的问题是NIL既是空列表又是原子。所以(atom nil)是正确的,但您希望将其视为空列表。要解决此问题,您需要单独处理(first list) nil。

答案 2 :(得分:1)

问题是,NIL虽然加倍the empty list,仍然是atom

CL-USER> (atom nil)
T
CL-USER> (atom '())
T
CL-USER> 

如果您需要忽略它,则需要更改第二个子句以专门检查NIL

...
((and (atom (first list)) (not (null (first list)))) ...)
...

另一个选择是更改基本案例,以便它在第一个返回值中正常处理NIL