(define (copy-ring r)
(define (append-ring r stop resultfirst resultlast)
(if (eq? r stop)
(begin
(set-cdr! resultlast resultfirst)
resultfirst)
(begin
(set-cdr! resultlast (list (car r)))
(append-ring (cdr r) stop resultfirst (cdr resultlast)))))
(let ((first-cell (cons (car r) '())))
(append-ring (cdr r) r first-cell first-cell)))