Ищу алгоритм для перестановки списка

Я пытался найти алгоритм, который будет делать следующее:

Алгоритму будет передан список следующего вида:

((start a b c) (d e f (start g h i) (j k l) (end)) (end) (m n o))

Затем он конкатенирует список, содержащий элемент begin, со всеми списками до списка, содержащего элемент end. Возвращаемый список должен выглядеть следующим образом:

((start a b c (d e f (start g h i (j k l)))) (m n o))

Алгоритм должен уметь работать со списками, содержащими start внутри других списков, содержащих start.

Edit:

Сейчас у меня вот что:

(defun conc-lists (l)
  (cond
      ((endp l) '())
      ((eq (first (first l)) 'start) 
          (cons (cons (first (first l)) (conc-lists (rest (first l))))) 
              (conc-lists (rest l)))
      ((eq (first (first l)) 'end) '())
      (t (cons (first l) (conc-lists (rest l))))))

но это не работает. Может быть, я должен перечислить или добавить вместо консинга?

Edit 2:

Программа выше не должна работать, поскольку я пытаюсь получить первый элемент не из списка. Вот что я придумал на данный момент:

(defun conc-lists (l)
  (cond
      ((endp l) '())
      ((eq (first (first l)) 'start) 
          (append (cons (first (first l)) (rest (first l))) 
              (conc-lists (rest l))))
      ((eq (first (first l)) 'end) '())
      (t (cons (first l) (conc-lists (rest l))))))

Вот результат, который я получаю:

(conc-lists ((START A B C) (D E F (START G H I) (J K L) (END)) (END) (M N O)))
1. Trace: (CONC-LISTS '((START A B C) (D E F (START G H I) (J K L) (END)) (END) (M N O)))
2. Trace: (CONC-LISTS '((D E F (START G H I) (J K L) (END)) (END) (M N O)))
3. Trace: (CONC-LISTS '((END) (M N O)))
3. Trace: CONC-LISTS ==> NIL
2. Trace: CONC-LISTS ==> ((D E F (START G H I) (J K L) (END)))
1. Trace: CONC-LISTS ==> (START A B C (D E F (START G H I) (J K L) (END)))
(START A B C (D E F (START G H I) (J K L) (END)))
6
задан user1176517 2 November 2012 в 06:43
поделиться