展平列表(同时删除' nil'并在"。"之后保留原子)在lisp中

时间:2017-01-25 03:50:53

标签: lisp common-lisp clisp

我想创建一个能够压缩列表并删除内部所有潜在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. 有没有办法解决它?

1 个答案:

答案 0 :(得分:2)

也许你应该用简单的英语思考应该做的扁平化功能:

  1. 基本情况:如果展平nil,请返回一个空列表。
  2. 基本情况:如果展平单个原子,则返回一个仅包含该原子的列表。
  3. 递归案例:如果展平对,请返回一个列表,将其car展平,并展平其cdr
  4. 以下是我实现我刚刚给出的描述的方式:

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