Переставить 2 элемента списка местами заданные по индексу (ошибка) - Lisp
Формулировка задачи:
Переставить 2 элемента списка местами заданные по индексу (номеру)
==> swap
Файл C:\HomeLisp\7.lsp успешно загружен
(swap '(1 2 3 4 5) 1 2)
Неожиданный конец списка.
Последнее выражение: NIL
Глубина вызова EVAL: 3
==> ERRSTATE
Связанно наверно с какой то особенностью хоумлиспа, помогите понять что не так
func (defun swap (List i1 i2)(let ((first nil)(second nil)(res nil)(tmp List)(i 0)) (loop (cond ((= i i1) (setq first (car List)))((= i i2) (setq second (car List))))(if (and first second)(return)) (setq List (cdr List))(setq i (+ i 1))) (setq i 0)(loop (if (null tmp)(return))(cond ((= i i1) (setq res (cons second res)))((= i i2) (setq res (cons first res)))(T (setq res (cons (car tmp) res)))) (setq tmp (cdr tmp)) (setq i (+ i 1)))(reverse res)))
Решение задачи: «Переставить 2 элемента списка местами заданные по индексу (ошибка)»
textual
Листинг программы
(defun swap (n m w) (rotatef (nth n w) (nth m w)) w) > (swap 2 5 '(1 2 3 4 5 6 7)) (1 2 6 4 5 3 7)
Объяснение кода листинга программы
В коде определён пользовательский функционал swap, который принимает три аргумента: n (номер первого элемента), m (номер второго элемента) и w (сам список).
Функция rotatef используется для перестановки элементов в списке w на позиции, заданные номерами n и m.
Поскольку функция rotatef меняет список w на месте, то после её вызова список w будет изменён.
Таким образом, результат выполнения функции swap будет равен изменённому списку w.
В данном примере список w имеет вид (1 2 3 4 5 6 7), а после выполнения функции swap с заданными аргументами (2 5) результат будет следующим: (1 2 6 4 5 3 7).