Я пытался найти алгоритм, который будет делать следующее:
Алгоритму будет передан список следующего вида:
((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)))