#lisp
#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. Для вашей функции требуется 6 аргументов. Рекурсивный вызов имеет только 1 аргумент. Почему вы игнорируете
list2
throughlist5
?2. Я очень новичок в lisp, и я не должен был этого делать, но не знаю, как рекурсивно проверить, пуст ли список? и замените пустой на что угодно.
3. Почему последний элемент результата
unknown
, а(unknown)
не как третий элемент?4. Поскольку последний элемент ввода равен
(null)
, нетnull
.5. Вы не ставите кавычки внутри списка, который уже заключен в кавычки. Первая цитата цитирует все целиком. И кавычки не отображаются в выходных данных, они просто часть синтаксиса ввода.
Ответ №1:
Прежде всего, ваш 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 (amp;rest things)
(color-recurse things))
(color nil '(3 4 5) '(nil) '(3 5 8) '(nil))
вывод:
(unknown (3 4 5) (unknown) (3 5 8) (unknown))
Комментарии:
1. Спасибо. Но дело в том, что функция имеет несколько параметров, которые принимают несколько аргументов list . И если какой-либо из этих списков пуст, я должен заменить на unknown или любой пустой список. Чтобы я мог перебирать каждый список и снова печатать элементы из каждого списка. Вероятно, теперь это имеет смысл, потому что я только что отредактировал вопрос.
2. Я добавил функцию-оболочку, которая принимает входные данные в качестве отдельных аргументов, используя
amp;rest
. Проще написать рекурсивную функцию с одним аргументом.3. Большое спасибо, Бармар, за ваши усилия по оказанию мне помощи. Но дело в том, что я пытаюсь выполнить домашнее задание. И эти параметры являются требованиями. И, кстати, последние параметры должны возвращать список, соответствующий последнему списку.
4. Ваш вопрос не очень понятен во всем этом. Пожалуйста, покажите фактический способ вызова функции.
5. (color ‘(1 (3 3) 5 nil (2 1) nil ): Я думаю, что именно так его и следует вызывать, и результат должен быть: ( 1 (3 3) 5 неизвестно (2 1) неизвестно). Функция шести аргументов. И извините за путаницу. Как я уже говорил ранее, я все еще изучаю lisp и очень новый для меня.