Code Review

Compare your solutions

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

  Следующая процедура, хотя и сложна для понимания, вполне может оказаться полезной:

    (define (mystery x)
      (define (loop x y)
        (if (null? x)
            y
            (let ((temp (cdr x)))
              (set-cdr! x y)
              (loop temp x))))
      (loop x '()))

  Loop пользуется «временной» переменной temp, чтобы сохранить старое значение cdr пары x, поскольку
  set-cdr! на следующей строке разрушает это значение cdr. Объясните, что за задачу выполняет mystery.
  Предположим, что переменная v определена выражением (define v (list 'a 'b 'c 'd)). Нарисуйте диаграмму,
  которая изображает список, являющийся значением v. Допустим, что теперь мы выполняем (define w (mystery v)).
  Нарисуйте стрелочные диаграммы, которые показывают структуры v и w после вычисления этого выражения.
  Что будет напечатано в качестве значений v и w?
|#

(#%require rackunit)

(define (mystery x)
  (define (loop x y)
    (if (null? x)
        y
        (let ((temp (cdr x)))
          (set-cdr! x y)
          (loop temp x))))

  (loop x '()))

(define v (list 'a 'b 'c 'd))

(define w (mystery v))

(check-equal? w '(d c b a))
(check-equal? v '(a))

#|
          ┏━━━┳━━━┓   ┏━━━┳━━━┓   ┏━━━┳━━━┓   ┏━━━┳━━━┓
    v ───►┃ • ┃ • ╂──►┃ • ┃ • ╂──►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛   ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           ▼           ▼           ▼
          ┏━━━┓       ┏━━━┓       ┏━━━┓       ┏━━━┓
          ┃ a ┃       ┃ b ┃       ┃ c ┃       ┃ d ┃
          ┗━━━┛       ┗━━━┛       ┗━━━┛       ┗━━━┛

  После вызова (mystery v):

                    ┌───────┐   ┌───────┐   ┌───────┐
          ┏━━━┳━━━┓ │ ┏━━━┳━┿━┓ │ ┏━━━┳━┿━┓ │ ┏━━━┳━┿━┓
    v ───►┃ • ┃ ╱ ┃◄┘ ┃ • ┃ • ┃◄┘ ┃ • ┃ • ┃◄┘ ┃ • ┃ • ┃◄─── w
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛   ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           ▼           ▼           ▼
          ┏━━━┓       ┏━━━┓       ┏━━━┓       ┏━━━┓
          ┃ a ┃       ┃ b ┃       ┃ c ┃       ┃ d ┃
          ┗━━━┛       ┗━━━┛       ┗━━━┛       ┗━━━┛
|#