这与SICP的第3.5章有关,正在讨论流。这个想法是:
(cons-stream 1 (display 'hey))
不应该评估cons-stream的第二部分,所以它不应该打印“嘿”。这确实发生了,我得到以下输出:
嘿(1。#< promise>)
所以我的结论是延迟不是作为特殊形式实现的?或者我做错了什么?我使用以下实现:
(define (cons-stream a b)
(cons a (delay b)))
延迟是默认的R5RS实施。这是实施中的错误,还是我没有做或正确理解它?
答案 0 :(得分:15)
你做创建一个承诺,但承诺是在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
定义为普通函数。如果要使 it 以相同的特殊方式运行,则必须将cons-stream
定义为宏。例如:
(define-syntax cons-stream
(syntax-rules ()
[(cons-stream x y) (cons x (delay y))]))