Вы выполняете создание обещания, но обещание создается внутри вашего cons-stream
, что означает, что уже слишком поздно, и выражение уже было оценено. Попробуйте это:
(define (foo x)
(display "foo: ") (write x) (newline)
x)
(cons-stream 1 (foo 2))
и вы увидите, что оно оценивается слишком рано. По той же причине это:
(define ones (cons-stream 1 ones))
и любой другой бесконечный список не будет работать, если ваш cons-stream
является функцией. Дело в том, что delay
- это особая форма, но вы не используете ее функцию, поскольку определяете cons-stream
как простую функцию. Вы должны определить cons-stream
как макрос, если хотите, чтобы он также вел себя так же. Например:
(define-syntax cons-stream
(syntax-rules ()
[(cons-stream x y) (cons x (delay y))]))