Бесконечные потоки SICP (глава 3.5.2)

Это вопрос, связанный с SICP. Книга Глава 3.5.2.

Я реализую структуру данных потока на других языках программирования. И я не уверен, правильно ли я понимаю следующий фрагмент.

(define (integers-starting-from n)
    (cons-stream n (integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

Из того, что я понял, в (integers-starting-from (+ n 1)) будет выполняться функция, которая возвращает значение, выполнив (cons-stream n (integers-starting-from (+ n 1)))). Поскольку вторым формальным параметром cons-stream является (integers-starting-from (+ n 1)), и поскольку он заключен в ( ), он будет выполнять функцию снова и снова бесконечно, вместо задержки выполнения.

Из того, что я вижу перед выполнением этого фрагмента, кажется, что следующее целое число приведет к бесконечной рекурсии еще до того, как будет выполнен элемент секунд потока.

Почему это работает для схемы, показанной во время лекции ?

Насколько я понимаю, вместо этого должно быть написано что-то вроде этого:

(define (integers-starting-from n)
    (cons-stream n (lambda() (integers-starting-from (+ n 1)))))

(define integers (integers-starting-from 1))

Означает ли это, что в схеме есть какая-то магия, которая задерживает выполнение (integers-starting-from (+ n 1)) ?

заранее спасибо


person Yeo    schedule 26.11.2013    source источник
comment
Для реализации несколько иного стиля потоков см. SRFI-41, который также доступны в моем блоге. В документе подробно описывается реализация cons-stream.   -  person user448810    schedule 26.11.2013


Ответы (1)


Хитрость заключается в том, как мы реализуем cons-stream. Вы явно создали оценочное обещание, когда определили преобразователь (lambda () ...). Это делает специальная форма cons-stream, но неявно и с использованием примитивов Scheme. Например, это может быть реализовано так, обратите внимание, как мы используем delay:

(define-syntax stream-cons
  (syntax-rules ()
    ((stream-cons head tail)
     (cons head (delay tail)))))

Имеет больше смысла инкапсулировать всю логику создания промисов в одном месте, скажем, cons-stream, вместо того, чтобы явно создавать переходники повсюду.

person Óscar López    schedule 26.11.2013