这是关于 SICP 的第 3.5 章,其中正在讨论流。这个想法是:
(cons-stream 1 (display 'hey))
不应该评估 cons-stream 的第二部分,因此它不应该打印“hey”。这确实发生了,我得到以下输出:
嘿(1.#)
所以我的结论是延迟不是作为一种特殊形式来实现的?或者我做错了什么?我使用以下实现:
(define (cons-stream a b)
(cons a (delay b)))
延迟是默认的 R5RS 实现。这是实施过程中的错误,还是我没有正确执行或理解它?
You do创造一个承诺,但这个承诺是在你的内心创造的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
如果你想制作一个宏it也以同样特殊的方式行事。例如:
(define-syntax cons-stream
(syntax-rules ()
[(cons-stream x y) (cons x (delay y))]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)