SICP无限流(第3.5.2节)

时间:2013-11-26 16:32:24

标签: stream scheme lisp sicp

这是与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))

的魔力

提前谢谢

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。