(define (make-ring n) (define (make-list n result) (if (= n 0) (cons 0 result) (make-list (-1+ n) (cons n result)))) (let* ((last-cel (list (-1+ n))) (first-cel (make-list (- n 2) last-cel))) (set-cdr! last-cel first-cel))) (define (show-ring r) (display (car r)) (display " ") (show-ring (cdr r))) (define (rotate-left r) (cdr r)) (define (rotate-right r) (define (loop-until-cdr-eq? lst cdrmustbe) (if (eq? (cdr lst) cdrmustbe) lst (loop-until-cdr-eq? (cdr lst) cdrmustbe))) (loop-until-cdr-eq? r r)) (define (show-ring-rev r) (display (car r)) (display " ") (show-ring-rev (rotate-right r)))