这是一个与 SICP Book Chapter 3.5.2 有关的问题.
我正在用其他编程语言实现流数据结构。而且我不确定我是否正确理解了以下代码片段。
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))
根据我在 (integers-starting-from (+ n 1))
中的理解,将执行通过执行 (cons-stream n (integers-starting-来自 (+ n 1))))
。因为cons-stream
的第二个形参是(integers-starting-from (+ n 1))
,又因为它被( )
,因此它会无限次地执行该函数,而不是延迟执行。
从我在执行此代码段之前看到的情况来看,似乎以下整数将导致无限递归,甚至在流的秒元素被执行之前。
为什么这似乎适用于 lecture 期间所示的方案?
根据我的理解,应该这样写:
(define (integers-starting-from n)
(cons-stream n (lambda() (integers-starting-from (+ n 1)))))
(define integers (integers-starting-from 1))
这是否意味着该方案具有某种延迟 (integers-starting-from (+ n 1))
执行的魔力?
提前致谢
最佳答案
诀窍在于我们如何实现cons-stream
。当您定义 (lambda () ...)
thunk 时,您明确创建了一个评估 promise 。特殊形式 cons-stream
可以做到这一点,但隐含地使用了 Scheme 的原语。比如可以这样实现,注意我们是如何使用delay
的:
(define-syntax stream-cons
(syntax-rules ()
((stream-cons head tail)
(cons head (delay tail)))))
将所有 promise 创建逻辑封装在一个地方更有意义,比如 cons-stream
,而不是在各处显式创建 thunk。
关于stream - SICP 无限流(第 3.5.2 章),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20222661/