Code Review

Compare your solutions

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

  Рассмотрим следующую процедуру make-cycle, которая пользуется last-pair из упражнения 3.12:

    (define (make-cycle x)
      (set-cdr! (last-pair x) x)
      x)

  Нарисуйте стрелочную диаграмму, которая изображает структуру z, созданную таким кодом:

    (define z (make-cycle (list 'a 'b 'c)))

  Что случится, если мы попробуем вычислить (last-pair z)?
|#

(#%require rackunit)

(define (last-pair x)
  (if (null? (cdr x))
      x
      (last-pair (cdr x))))

(define (make-cycle x)
  (set-cdr! (last-pair x) x)
  x)

(define z (make-cycle (list 'a 'b 'c)))

(check-equal? (cdddr z) z)

#|
  Программа зациклится, если мы попробуем вычислить (last-pair z), т.к. (cdr x) никогда не будет
  удовлетворять null?.

            ┌───────────────────────────┐
            ▼                           │
          ┏━━━┳━━━┓   ┏━━━┳━━━┓   ┏━━━┳━┿━┓
    z ───►┃ • ┃ • ╂──►┃ • ┃ • ╂──►┃ • ┃ • ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           ▼           ▼
          ┏━━━┓       ┏━━━┓       ┏━━━┓
          ┃ a ┃       ┃ b ┃       ┃ c ┃
          ┗━━━┛       ┗━━━┛       ┗━━━┛

  Тем не менее, scheme (или racket) может вывести зацикленный список, но попытка вычислить длину так же
  приводит программу к зацикливанию.
|#