; 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)
OyBhcnJheSByb3RhdGlvbgoKKGRlZmluZSAocm90YXRlIGFyeSBsZW4gZGlzdCkKICAoZG8gKChpZHggMCAoKyBpZHggMSkpKSAoKD0gaWR4IChnY2QgZGlzdCBsZW4pKSBhcnkpCiAgICAobGV0ICgodGVtcCAodmVjdG9yLXJlZiBhcnkgaWR4KSkpCiAgICAgIChkbyAoKGxvIGlkeCBoaSkgKGhpIChtb2R1bG8gKCsgaWR4IGRpc3QpIGxlbikgKG1vZHVsbyAoKyBoaSBkaXN0KSBsZW4pKSkKICAgICAgICAgICgoPSBoaSBpZHgpICh2ZWN0b3Itc2V0ISBhcnkgbG8gdGVtcCkpCiAgICAgICAgKHZlY3Rvci1zZXQhIGFyeSBsbyAodmVjdG9yLXJlZiBhcnkgaGkpKSkpKSkKCihkaXNwbGF5IChyb3RhdGUgJyMoYSBiIGMgZCBlIGYgZyBoKSA4IDMpKSAobmV3bGluZSk=