понедельник, 10 января 2011 г.

Exercise-3-12


Упражнение 3.12.
В разделе 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);b
(define w (append! x y));(a b c d)
w ;(a b c d)
(cdr x);(b c d)

В переменные z и w записываются “одинаковые” списки,но во втором случаем изначальный список также изменяется, чти и видно по выводу.

Комментариев нет:

Отправить комментарий