在 lisp 中展平列表(同时删除 'nil' 并在“.”之后保留原子)
Flattening lists (while removing 'nil' and keeping atoms after " . ") in lisp
我想创建一个函数来展平列表并删除其中所有可能的 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
,return 一个空列表。
- 基本情况:如果展平单个原子,return 一个仅包含该原子的列表。
- 递归情况:如果展平对,return 一个列表附加其
car
的展平及其 cdr
. 的展平
下面是我如何实现我刚刚给出的描述:
(defun flatten (x)
(cond ((null x) x)
((atom x) (list x))
(t (nconc (flatten (car x)) (flatten (cdr x))))))
我想创建一个函数来展平列表并删除其中所有可能的 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
,return 一个空列表。 - 基本情况:如果展平单个原子,return 一个仅包含该原子的列表。
- 递归情况:如果展平对,return 一个列表附加其
car
的展平及其cdr
. 的展平
下面是我如何实现我刚刚给出的描述:
(defun flatten (x)
(cond ((null x) x)
((atom x) (list x))
(t (nconc (flatten (car x)) (flatten (cdr x))))))