; partial list reversal

(use-modules (srfi srfi-11))

(define (split n xs)
  (let loop ((n n) (xs xs) (zs '()))
    (if (or (zero? n) (null? xs))
        (values (reverse zs) xs)
        (loop (- n 1) (cdr xs) (cons (car xs) zs)))))

(define (list-part-rev xs start finish)
  (let*-values (((temp end) (split finish xs))
                ((beginning middle) (split start temp)))
    (append beginning (reverse middle) end)))

(display (list-part-rev '(0 1 2 3 4 5 6 7 8 9) 3 6)) (newline)