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