1. т.к. прога до конца не оформлена, то
(setq VARIANTS NIL)
(setq ELEMENT NIL)
(setq PREFIX NIL)
(setq SUFFIX NIL)
просто обнуляют переменные.
2.
(setq N (length DETAILLIST))
(setq N (- (repeat (1- (length DETAILLIST)) (setq N (+ N (1- (length DETAILLIST))))) 2))
(repeat N ...)
появилось после росписи на бумажке :), можно заменить на:
(while (not (equal TEMPLIST DETAILLIST)) ...)
т.о. для списка '(1 2 3 4) получаем:
(
(1 2 3 4)
(2 1 3 4)
(2 3 1 4)
(2 3 4 1)
(3 2 4 1)
(3 4 2 1)
(3 4 1 2)
(4 3 1 2)
(4 1 3 2)
(4 1 2 3)
(1 4 2 3)
(1 2 4 3)
)
Логика прослеживается?
Тогда получим:
(setq ELEMENT (list (car DETAILLIST)))
(setq PREFIX (list (cadr DETAILLIST)))
(setq SUFFIX (cddr DETAILLIST))
(setq VARIANTS (list (append ELEMENT PREFIX SUFFIX)))
(setq TEMPLIST (append PREFIX ELEMENT SUFFIX))
(while (not (equal TEMPLIST DETAILLIST))
(setq VARIANTS (append VARIANTS (list TEMPLIST)))
(if SUFFIX
(progn
(setq PREFIX (append PREFIX (list (car SUFFIX))))
(setq SUFFIX (cdr SUFFIX))
(setq TEMPLIST (append PREFIX ELEMENT SUFFIX))
) ;_ end of progn
(progn
(setq ELEMENT (list (car TEMPLIST)))
(setq PREFIX (list (cadr TEMPLIST)))
(setq SUFFIX (cddr TEMPLIST))
(setq TEMPLIST (append PREFIX ELEMENT SUFFIX))
) ;_ end of progn
) ;_ end of if
) ;_ end of repeat
VARIANTS
3.Длина запускаемого списка DETAILLIST в среднем около 30-40 элементов.