Прежде всего, ваш синтаксис 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))