Как я могу раскрыть вложенные скобки рекурсивно в языке Common LISP Такой как
(unnest '(a b c (d e) ((f) g))) => (a b c d e f g)
(unnest '(a b)) => (a b)
(unnest '(() ((((a)))) ())) => (a)
Спасибо
Вы можете определить это, например, так:
(defun unnest (x)
(labels ((rec (x acc)
(cond ((null x) acc)
((atom x) (cons x acc))
(t (rec (car x) (rec (cdr x) acc))))))
(rec x nil)))
В Лиспе есть функция remove
для удаления вещей. Здесь я использую версию REMOVE-IF
, которая удаляет все элементы, для которых истинен предикат. Я проверяю, является ли это круглой скобкой, и удаляю ее, если это правда.
Если вы хотите удалить скобки, см. Эту функцию:
(defun unnest (thing)
(read-from-string
(concatenate
'string
"("
(remove-if (lambda (c)
(member c '(#\( #\))))
(princ-to-string thing))
")")))
Обратите внимание, однако, как упоминает Сванте, обычно скобки не «удаляют».
(defun flatten (l)
(cond ((null l) nil)
((atom l) (list l))
(t (loop for a in l appending (flatten a)))))
(defun flatten (l)
(cond ((null l) nil)
((atom (car l)) (cons (car l) (flatten (cdr l))))
(t (append (flatten (car l)) (flatten (cdr l))))))