Опишите функцию, которая из исходного списка формирует список, содержащий только символьные атомы, учитывая элементы подсписков / common lisp

Опишите функцию, которая из исходного списка формирует список, содержащий только символьные атомы, учитывая элементы подсписков. Например, результатом применения функции к аргументу ’(a 3 (4 b 7 c (4 d)) e) должен быть ’(a (b c (d)) e).

Помогите решить эту задачу на языке common lisp


Ответы (1 шт):

Автор решения: Frog

Ну навскидку будет что-то такое.

(defun func (lst) 
(if (atom lst) 
    (if (symbolp lst) 
        lst 
        nil
    )
    (if (null (func (car lst))) 
        (func (cdr lst))
        (cons (func (car lst)) (func (cdr lst)) ))))

(print (func '(1 2 a b 2 ( c ( d 15)))))
;(A B (C (D))) 

Можно, наверное, еще как-то поредуцировать функцию.

Суть ее такова :

Если у нас атомарный элемент (символ, число), то дальше проверяем с помощью функции symbolp — символ ли это, если символ, то возврщаем его, иначе nil.

Если перед нами список, то каждый его элемент рекурсивно прогоняем через эту же функцию. Далее, из всех элементов, не равных nil создается список. Пустые списки сворачиваются.

→ Ссылка