我想创建一个函数来压平列表并删除其中所有潜在的nil
。
预期行为,示例1:
(myfunc '(a (b (c) (d)) (e f) (g (h)) nil)) => (a b c d e f g h)
预期行为,示例2:
(myfunc '(a . d)) => (a d)
到目前为止我的功能:
(defun myfunc (l)
(cond
((atom l) nil)
((and (atom (car l)) (not (equal (car l) nil))) (cons (car l) (myfunc (cdr l))))
(t (append (myfunc (car l)) (myfunc (cdr l))))))
我的函数在第一个示例中按预期工作,但在第二个示例中没有。我得到:
(myfunc '(a . d)) => (a)
为什么不保留
d
?有办法解决它吗?
也许你应该考虑一下flatten函数应该做什么,用通俗的英语来说:
- 基本情况:如果使
nil
变平,则返回一个空列表 - 基本情况:如果使单个原子变平,则返回一个仅包含该原子的列表
- 递归情况:如果平坦化对,则返回一个列表,该列表将其
car
的平坦化与cdr
的平坦化相加
以下是我如何实现刚才给出的描述:
(defun flatten (x)
(cond ((null x) x)
((atom x) (list x))
(t (nconc (flatten (car x)) (flatten (cdr x))))))