; array rotation

(define (rotate ary len dist)
  (do ((idx 0 (+ idx 1))) ((= idx (gcd dist len)) ary)
    (let ((temp (vector-ref ary idx)))
      (do ((lo idx hi) (hi (modulo (+ idx dist) len) (modulo (+ hi dist) len)))
          ((= hi idx) (vector-set! ary lo temp))
        (vector-set! ary lo (vector-ref ary hi))))))

(display (rotate '#(a b c d e f g h) 8 3)) (newline)