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 ┃
┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛
|#