; deletion from a cyclical list (define (last-pair xs) (if (null? xs) (error 'last-pair "empty list") (if (null? (cdr xs)) xs (last-pair (cdr xs))))) (define (cycle . xs) (set-cdr! (last-pair xs) xs) xs) (define (remove-cycle eql? x xs) (let loop ((ys (cdr xs))) (if (eql? x (car ys)) (remove-head ys) (if (eq? xs ys) xs (loop (cdr ys)))))) (define (remove-head xs) (let loop ((ys (cdr xs))) (cond ((eq? xs (cdr ys)) (set-cdr! ys (cddr ys)) ys) (else (loop (cdr ys)))))) (define xs (cycle 2 3 5 7 11 13 17 19 23 29)) (set! xs (remove-cycle = 2 xs)) (set! xs (remove-cycle = 11 xs)) (set! xs (remove-cycle = 19 xs)) (set! xs (remove-cycle = 21 xs)) (set! xs (remove-cycle = 23 xs)) (display xs) (newline)