我想创建一个能够压缩列表并删除内部所有潜在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
?
有没有办法解决它?
答案 0 :(得分:2)
也许你应该用简单的英语思考应该做的扁平化功能:
nil
,请返回一个空列表。car
展平,并展平其cdr
。以下是我实现我刚刚给出的描述的方式:
(defun flatten (x)
(cond ((null x) x)
((atom x) (list x))
(t (nconc (flatten (car x)) (flatten (cdr x))))))