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

Exercise-3.14


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

Упражнение оказалось глубже чем кажется на первый взгляд. При беглом ознакомление кажется что mystery всего лишь странная реализация reverse, но при дальнейшем рассмотрении оказывается что она обладает побочным эффектом оставляя лишь первый элемент в передаваемом ей списке. Все это должно подвигнуть нас на глубокие размышления о побочных эффектах функций.

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

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