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