Добавление списков
В разделе 2.2.1 была введена следующая процедура для добавления одного списка к другому:
(define (append x y)
(if (null? x)
y
(cons (car x) (append (cdr x) y))))
Append
порождает новый список, по очереди наращивая элементы
x
в начало
y
. Процедура
append!
подобна
append
, но только она является не конструктором, а мутатором. Она склеивает списки вместе, изменяя последнюю пару
x
так, что ее
cdr
становится равным
y
. (Вызов
append!
с пустым
x
является ошибкой.)
(define (append! x y)
(set-cdr! (last-pair x) y)
x)
Здесь
last-pair
— процедура, которая возвращает последнюю пару своего аргумента:
(define (last-pair x)
(if (null? (cdr x))
x
(last-pair (cdr x))))
Рассмотрим последовательность действий
(define x (list 'a 'b))
(define y (list 'c 'd))
(define z (append x y))
z
(a b c d)
(cdr x)
<ответ>
(define w (append! x y))
w
(a b c d)
(cdr x)
<ответ>
Каковы будут пропущенные
<ответы>
? Объясните, нарисовав стрелочные диаграммы.
Комментарии отсутствуют.