Code Review

Compare your solutions

    #|
  Упражнение 3.19

  Переделайте упражнение 3.18, используя фиксированное количество памяти. (Тут нужна достаточно хитрая
  идея.)
|#

(#%require rackunit)

(define (cycle? L)
  (define (rec lst)
    (if (null? lst)
        #f
        (let ((item (car lst)))
        (if (and (pair? item)
                 (eq? (cdr item) 'passed))
            #t
            (begin
              (set-car! lst (cons item 'passed))
              (rec (cdr lst)))))))

  (rec L))

(define lE '())
(define l0 '(1 2 3))

(define lx '(1 2 3))
(define l1 (cons lx lx))

(define l2 '(1 2 3))
(set-cdr! (cddr l2) l2)

(define l3 '(1 2 3))
(set-cdr! (cddr l3) (cdr l3))

(define l4 '(1 2 3 4))
(set-car! (cddr l4) (cdr l4))

(check-false (cycle? lE))
(check-false (cycle? l0))
(check-false (cycle? l1))
(check-false (cycle? l4))
(check-true (cycle? l2))
(check-true (cycle? l3))