8

这与 SICP 的第 3.5 章有关,其中正在讨论流。这个想法是:

(cons-stream 1 (display 'hey))

不应该评估 cons-stream 的第二部分,所以它不应该打印“hey”。这确实发生了,我得到以下输出:

嘿(1 . #< 承诺 >)

所以我的结论是延迟没有作为一种特殊的形式来实现?还是我做错了什么?我使用以下实现:

(define (cons-stream a b) 
  (cons a (delay b)))

延迟是默认的 R5RS 实现。这是实施中的错误,还是我没有正确或理解它?

4

1 回答 1

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为一个普通的函数。cons-stream如果您想让它也以相同的特殊方式运行,则必须将其定义为宏。例如:

(define-syntax cons-stream
  (syntax-rules ()
    [(cons-stream x y) (cons x (delay y))]))
于 2011-04-10T08:07:33.960 回答