在 lisp 中扁平化列表(同时删除 'nil' 并将原子保留在 ". ")



我想创建一个函数来压平列表并删除其中所有潜在的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) 
  1. 为什么不保留d

  2. 有办法解决它吗?

也许你应该考虑一下flatten函数应该做什么,用通俗的英语来说:

  1. 基本情况:如果使nil变平,则返回一个空列表
  2. 基本情况:如果使单个原子变平,则返回一个仅包含该原子的列表
  3. 递归情况:如果平坦化对,则返回一个列表,该列表将其car的平坦化与cdr的平坦化相加

以下是我如何实现刚才给出的描述:

(defun flatten (x)
(cond ((null x) x)
((atom x) (list x))
(t (nconc (flatten (car x)) (flatten (cdr x))))))

最新更新