Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp 如何避免NIL被添加到列表中?_Lisp - Fatal编程技术网

Lisp 如何避免NIL被添加到列表中?

Lisp 如何避免NIL被添加到列表中?,lisp,Lisp,我是口齿不清的新手。我已经用lisp编写了一个展平函数 (defun flatten (list) (cond ((null list) nil) ((atom (first list)) (cons (first list) (flatten (rest list)))) (t (append (flatten (first list)) (flatten (rest list)))))) 输入- (展平(a()b(cd))) 预期输出-

我是口齿不清的新手。我已经用lisp编写了一个展平函数

(defun flatten (list)
  (cond ((null list) nil)
        ((atom (first list))
         (cons (first list) (flatten (rest list))))
        (t (append (flatten (first list)) (flatten (rest list))))))
输入-
(展平(a()b(cd)))

预期输出-
(a b c d)

我的输出-
(a无b c d)


我应该怎么做才能避免“nil”被添加到列表中?我应该创建一个递归函数。

(atom nil);=>当然,既然
()
nil
,你需要建立一个新的基本情况,它只是递归,而不是考虑它是nil

您的问题是NIL既是一个空列表,也是一个原子。所以
(atom nil)
是真的,但您希望将其视为空列表。要解决这个问题,您需要分别处理
(第一个列表)
为零。

问题是
为零
,同时作为
空列表
,仍然是一个
原子

CL-USER> (atom nil)
T
CL-USER> (atom '())
T
CL-USER> 
如果您需要忽略它,那么您需要更改第二个子句来检查
NIL

...
((and (atom (first list)) (not (null (first list)))) ...)
...

另一个选项是更改基本大小写,以便它在第一个返回值中优雅地处理
NIL
s。

明白了!谢谢你的帮助。:)