
308
Глава 3. Модульность, объекты и состояние
(define (fibgen a b)
(cons-stream a (fibgen b (+ a b))))
(define fibs (fibgen 0 1))
Fibs представляет собой пару, car которой равен 0, а cdr является обещанием
вычислить (fibgen 1 1). Когда мы выполняем это задержанное (fibgen 1 1), оно
порождает пару, где car равен 1, а в cdr лежит обещание вычислить (fibgen 1 2),
и так далее.
Чтобы продемонстрировать пример более интересного потока, можно о бобщить no-
sevens и построить бесконечный поток простых чисел, используя метод, известный как
решето Эратосфена (sieve of Eratosthenes)
60
. Сначала мы строим поток чисел, начи-
ная с 2, первого простого числа. Для того, чтобы найти остальные простые числа, мы
фильтруем кратные двойки из потока остальных чисел. Получается поток, который начи-
нается с 3, следующего простого числа. Теперь из остатка потока мы фильтруем числа,
кратные 3. Получается поток, начинающийся с 5, следующего простого, и так далее.
Другими словами, м ы строим простые числа с помощью просеивающего процесса, опи-
сываемого так: чтобы просеять поток S, нужно сформировать поток, в котором первый
элемент совпадает с первым элементом S, а остаток получается фильтрацией множите-
лей первого элемента из оставшейся части S и просеивания того, что получится. Такой
процесс нетрудно описать в терминах операций над потоками:
(define (sieve stream)
(cons-stream
(stream-car stream)
(sieve (stream-filter
(lambda (x)
(not (divisible? x (stream-car stream))))
(stream-cdr stream)))))
(define primes (sieve (integers-starting-from 2)))
Теперь, чтобы найти определенное простое число, надо только попр осить:
(stream-ref primes 50)
233
Интересно представить себе систему обработки сигналов, соответствующую sieve,
показанную на «хендерсоновской диаграмме» на рисунке 3.31
61
. Входной поток попада-
ет в «расconsер», который отделяет первый элемент потока от его хвоста. При помощи
60
Эратосфен, греческий философ третьего века до н. э. из Александрии, знаменит тем, что он дал первую
верную оценку длины окружности Земли, которую он вычислил, наблюдая тени, отбрасываемые в полдень
летнего солнцестояния. Метод решета Эратосфена, несмотря на свою древность, лежал в основе специальных
аппаратных устройств-«решет», которые до недавних пор был и самыми мощными устройствами для поиска
простых чисел. Однако начиная с 70-х годов такие устройства были вытеснены развитием вероятностных
методик, обсуждаемых в разделе 1.2.6.
61
Мы назвали этот способ изображения потоков в честь Питера Хендерсона, который первым показал нам
диаграммы такого вида как способ рассуждений об обработке потоков. Сплошные линии представляют потоки
передаваемых сигналов. Прерывистая линия от car к cons и filter указывает, что здесь передается не
поток, а единичное значение.