Получения списка атомов заданного S-выражения

Решил заняться изучением Lisp'а, нашел учебник, лекции в интернете, сижу, разбираюсь.

Собственно, нашел задание:
Напишите функцию, возвращающую список атомов из данного S-выражения в том же порядке, в котором они в него входят.
Пример:
> (atoms '((a b) c nil (d (e f g))))
(A B C NIL D E F G)


Написал
(DEFUN atoms (x)
	(COND 
		((NULL x) NIL)
		((ATOM x) x)
		(T
			(list 
				(atoms (list (CAR x))) 
				(atoms (list (CDR x)))
			)
		)
	)
)



Однако адекватно она работает только в 2-х случаях — когда на вход подали пустой список, либо атом. Любой уход в рекурсию и в результате получаем Stack Overflow

Вопрос — что я делаю не так?
Вроде, по моим представлениям, всё правильно.
  • Вопрос задан
  • 3337 просмотров
Пригласить эксперта
Ответы на вопрос 2
Amper
@Amper
(DEFUN atoms (x)
    (COND 
        ((NULL x) NIL)
        ((ATOM x) (list x))
        (T
            (APPEND 
                (atoms (CAR x))
                (atoms (CDR x))
            )
        )
    )
)
Ответ написан
@nconc
варианты:
(defun atoms (w)
  (loop for a in w
        if (atom a) collect a
        else append (atoms a)))

>  (atoms '((a b) c nil (d (e f g))))
(A B C NIL D E F G)

(defun atoms (w)
  (typecase w (atom `(,w))
            (t (mapcan #'atoms w))))

>  (atoms '((a b) c nil (d (e f g))))
(A B C NIL D E F G)

(defun atoms (w)
  (if (atom w) `(,w) (mapcan #'atoms w)))

>  (atoms '((a b) c nil (d (e f g))))
(A B C NIL D E F G)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы