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) может вывести зацикленный список, но попытка вычислить длину так же
приводит программу к зацикливанию.
|#