Как раскрыть вложенные скобки в LISP

Как я могу раскрыть вложенные скобки рекурсивно в языке 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)

Спасибо

18
задан sepp2k 31 October 2010 в 18:29
поделиться

4 ответа

Вы можете определить это, например, так:

(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)))
3
ответ дан 30 November 2019 в 06:19
поделиться

В Лиспе есть функция remove для удаления вещей. Здесь я использую версию REMOVE-IF , которая удаляет все элементы, для которых истинен предикат. Я проверяю, является ли это круглой скобкой, и удаляю ее, если это правда.

Если вы хотите удалить скобки, см. Эту функцию:

(defun unnest (thing)
  (read-from-string
   (concatenate
    'string
    "("
    (remove-if (lambda (c)
                 (member c '(#\( #\))))
               (princ-to-string thing))
    ")")))

Обратите внимание, однако, как упоминает Сванте, обычно скобки не «удаляют».

1
ответ дан 30 November 2019 в 06:19
поделиться
(defun flatten (l)
  (cond ((null l) nil)
        ((atom l) (list l))
        (t (loop for a in l appending (flatten a)))))
14
ответ дан 30 November 2019 в 06:19
поделиться
(defun flatten (l)
  (cond ((null l) nil)
        ((atom (car l)) (cons (car l) (flatten (cdr l))))
        (t (append (flatten (car l)) (flatten (cdr l))))))
6
ответ дан 30 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: