суббота, 8 января 2011 г.

Exercise-3-06


Упражнение 3.6.
Полезно иметь возможность сбросить генератор случайных чисел, чтобы получить последовательность, которая начинается с некоторого числа. Постройте новую процедуру rand, которая вызывается с аргументом. Этот аргумент должен быть либо символом generate, либо символом reset. Процедура работает так: (rand ’generate) порождает новое случайное число;
((rand ’reset) hновое-значениеi) сбрасывает внутреннюю переменную состояния в указанное hновое-значениеi. Таким образом, сбрасывая значения, можно получать повторяющиеся последовательности. Эта возможность очень полезна при тестировании и отладке программ, использующих случайные числа.


Ух и довелось мне помучаться с этим, казалось бы, не сложным упражнением. Сложность его в том, что до этого в книги мы создавали некоторую функцию-фабрику и инкапсулировали в ней состояние. Тут такой прием не прокатывает. Интересно, что на том блоге где я сверял решение эта задача пропущена. Итак решение с новым способом объявления функций. Тут мы превратили rand в “фабрику” и функцию использующую состояние одновременно. random-val возвращает следующее случайное число.

(define rand
  (let ((previous 0))
    (λ (dispatcher)
      (cond ((eq? dispatcher 'generate)
             (set! previous (random-val previous))
             previous)
            ((eq? dispatcher 'reset)
             (λ(new-val)(set! previous new-val) ))
            (else (error "Illegal message"))))))

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

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