Переставить 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д