не могли бы вы помочь мне решить сложную домашнюю работу о вложенном списке? В принципе в любое время, когда предикат evenp является истинным, я должен удалить элемент из списка (или из вложенного списка), сохраняя структуру всего списка.Как удалить элемент из вложенного списка lisp
(Nopred 'evenp '(1 S d ((4)) (7) ((((8)))) u))
Она должна возвращать
(1 S d (()) (7) (((()))) u)
Это функция, которую я написал
(Defun nopred (f list)
(Cond ((null list))
((Symbolp (car list)) (cons (car list) (nopred f (cdr list)))
((Listp (car list)) (cons (nopred f (car list)) (nopred f (cdr list))))
((Funcall f (car list)) (nopred f (cdr list)))
(T (cons (car list) (nopred f (cdr list))))))
Я пытался решить с помощью этого кода, но он не работает, он не удаляет элемент когда evenp истинно и возвращает значения, такие как
((((5 .T) .).).)
является '(корд л)' копировальные ошибки? Разве это не '(список cdr)'? – Barmar
Когда отступ исправляется, вы можете увидеть проблему. Вам не хватает ')' в конце строки 'Symbolp', поэтому весь этот код рассматривается как часть этого случая. Но это должно вызывать ошибки, поэтому я подозреваю, что это еще одна ошибка копирования. Отправьте фактический код с правильным отступом, иначе мы не сможем сказать, что действительно не так. – Barmar
Особое обращение с символами кажется ошибочным идеологически. Я понимаю, что это нужно, чтобы избежать ошибок в '(evenp S)' & c, но это все еще неправильно. – sds