Мы можем упростить решение, для начала вам не нужно так много случаев, либо в списке>> 2 элемента, либо нет.
В Racket мы можем использовать интуитивно названное first
иsecond
процедуры получения первого и второго элементов в списке, а элементы после этого можно получить с помощью не столь интуитивно понятной процедуры cddr
.
Последний шаг - просто cons
все вместе, чтобы составить правильный список. Вы использовали (append (list ...))
, поэтому последняя часть появилась внутри списка. Лучше потратить некоторое время на ознакомление с тем, как работают cons
, list
и append
. Вот что я имею в виду:
(define swap-two
(λ (lst)
(if (< (length lst) 2)
"less than two"
(cons (second lst)
(cons (first lst)
(cddr lst))))))
Работает как положено:
(swap-two '(a b c d e f))
=> '(b a c d e f)