如何在Lisp中递归检查列表是否为空?

时间:2019-04-13 05:00:54

标签: lisp

我的功能叫做:

(defun color ( list1 list2 list3 list4 list5 listoflist))

(defun color (list1 list2 list3 list4 list5 listoflist)                           
    (cond 
        (null list1) 'unknown )
        (list (list1, list2 list3 list4 list5 lisoflist))
        (null list2) 'unknown)
          (list (list1 list2 list3 list4 list5 listoflist)

         (null list3) 'unknown )
        (null list4) 'unknown) 
        (null list5) 'unknown )

        (T (cons (car list1) (color (cdr list1) list2)))    ; recursively tring to replace with unknow if any of the lis tis empty and print the resulte ouptput
    )
)

如果输入是:(color null '(3 4 5) null) '(3 5 8) null)) 它应该产生(unknown (3 4 5) unknown (3 4 5) unknown)

1 个答案:

答案 0 :(得分:2)

首先,您的COND语法不正确。 COND的语法为:

(cond
    (condition1 result1...)
    (condition2 result2...)
    ...
)

条件和结果的每个组合都应在列表中。您在T条件下正确地执行了此操作,但在(null list1)条件下没有正确地进行了操作。应该是:

(cond
    ((null list1) unknown)
    (t (color (cdr listoflist)))
)

但是您的功能逻辑对于您想做的事情是完全错误的。

首先,该函数不应使用多个参数。它应该只接受一个list参数。

第二,您需要映射到列表以递归处理每个元素。

第三,您需要引用unknown才能按原样返回它。

第四,在输入中,空白列表应为nil(),而不是null。那就是测试列表是否为空的函数的名称。

(defun color-recurse (thing)
  (cond ((null thing) 'unknown)
        ((listp thing) (mapcar #'color-recurse thing))
        (t thing)))

(defun color (&rest things)
  (color-recurse things)) 

(color nil '(3 4 5) '(nil) '(3 5 8) '(nil))

输出:

(unknown (3 4 5) (unknown) (3 5 8) (unknown))