Как я могу проверить, является ли список рекурсивно пустым в lisp? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть функция под названием:

(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 Ответ

2 голосов
/ 13 апреля 2019

Прежде всего, ваш синтаксис 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...