; list swap

(define (swap k xs)
  (if (< k 1) (error 'swap "don't be silly")
    (let ((s #\space) (nl #\newline))
      (let loop1 ((n 1) (kth #f) (n-k 0) (qs xs) (ys xs) (zs (list)))
        (for-each display `("loop1 " ,n ,s ,kth ,s ,n-k ,s ,qs ,s ,ys ,s ,zs ,nl))
        (cond ((= k n) (if (null? ys) (error 'swap "k too big")
                         (loop1 (+ n 1) (car ys) 1 xs (cdr ys) (cons (car ys) zs))))
              ((pair? ys) (loop1 (+ n 1) kth (+ n-k 1) (cdr qs) (cdr ys) (cons (car ys) zs)))
              ((< n k) (error 'swap "k too big"))
              (else (let loop2 ((i 1) (zs zs) (ys (list)))
                      (for-each display `("loop2 " ,i ,s ,zs ,s ,ys ,nl))
                      (cond ((= i k) (loop2 (+ i 1) (cdr zs) (cons kth ys)))
                            ((= i n-k) (loop2 (+ i 1) (cdr zs) (cons (car qs) ys)))
                            ((pair? zs) (loop2 (+ i 1) (cdr zs) (cons (car zs) ys)))
                            (else ys)))))))))

(display (swap 1 '(1 2 3 4 5 6 7))) (newline)
(display (swap 2 '(1 2 3 4 5 6 7))) (newline)
(display (swap 3 '(1 2 3 4 5 6 7))) (newline)
(display (swap 4 '(1 2 3 4 5 6 7))) (newline)
(display (swap 5 '(1 2 3 4 5 6 7))) (newline)
(display (swap 6 '(1 2 3 4 5 6 7))) (newline)
(display (swap 7 '(1 2 3 4 5 6 7))) (newline)

(newline) (newline)

(define (swap k xs)
  (if (< k 1) (error 'swap "don't be silly")
    (let loop ((n 1) (ps xs) (qs xs) (ys xs))
      (display n) (display " ") (display ps) (display " ")
      (display qs) (display " ") (display ys) (newline)
      (cond ((= k n) (if (null? ys) (error 'swap "k too big")
                       (loop (+ n 1) ys xs (cdr ys))))
            ((pair? ys) (loop (+ n 1) ps (cdr qs) (cdr ys)))
            ((< n k) (error 'swap "k too big"))
            (else (let ((t (car ps)))
                    (set-car! ps (car qs))
                    (set-car! qs t))
                  xs)))))

(display (swap 1 '(1 2 3 4 5 6 7))) (newline)
(display (swap 2 '(1 2 3 4 5 6 7))) (newline)
(display (swap 3 '(1 2 3 4 5 6 7))) (newline)
(display (swap 4 '(1 2 3 4 5 6 7))) (newline)
(display (swap 5 '(1 2 3 4 5 6 7))) (newline)
(display (swap 6 '(1 2 3 4 5 6 7))) (newline)
(display (swap 7 '(1 2 3 4 5 6 7))) (newline)