方案,SICP,R5RS,为什么延迟不是特殊形式?

时间:2011-04-10 08:01:10

标签: scheme sicp r5rs

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

(cons-stream 1 (display 'hey))

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

嘿(1。#< promise>)

所以我的结论是延迟不是作为特殊形式实现的?或者我做错了什么?我使用以下实现:

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

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

1 个答案:

答案 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))]))