Ниже приведен отрывок из книги SICP, раздел 4.2.3 Потоки как отложенные списки:
При ленивом вычислении потоки и списки могут быть идентичными, поэтому нет необходимости в специальных формах или отдельных операциях со списками и потоками. Все, что нам нужно сделать, это упорядочить все так, чтобы
cons
не было строгим. Один из способов добиться этого — расширить ленивый вычислитель, чтобы он позволял использовать нестрогие примитивы, и реализоватьcons
как один из эти. Легче всего напомнить (раздел 2.1.3), что нет принципиальной необходимости реализовыватьcons
как примитив. Вместо этого мы можем представить пары как процедуры:(define (cons x y) (lambda (m) (m x y))) (define (car z) (z (lambda (p q) p))) (define (cdr z) (z (lambda (p q) q)))
Вопрос: я не понимаю, как приведенное выше определение cons
обеспечивает ленивое или нестрогое поведение. Например, следующий вызов cons
,
(define (foo) '(1 2 3))
(define bar (cons 'a (foo)))
действительно приводит к вызову foo
в момент вызова cons
, что не является ленивым или строгим поведением.
Итак, как бы мы написали ленивую или нестрогую версию cons
, которая также не является особой формой.
delay
иcons-stream
. Это звучало так, как будто авторы пытаются избавиться от специальных форм ВНЕ оценщика в текущем разделе 4.2.3. - person Harry   schedule 02.03.2017