这是与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-from (+ 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))
?
提前谢谢
答案 0 :(得分:8)
诀窍在于我们如何实施cons-stream
。您在定义(lambda () ...)
thunk时明确创建了评估承诺。特殊形式cons-stream
执行此操作,但隐式使用Scheme的基元。例如,它可以像这样实现,注意我们如何使用delay
:
(define-syntax stream-cons
(syntax-rules ()
((stream-cons head tail)
(cons head (delay tail)))))
将所有承诺创建逻辑封装在一个地方更有意义,比如cons-stream
,而不是在任何地方明确地创建thunk。