SICP无限流(第3.5.2节)

Yeo*_*Yeo 5 lisp scheme stream 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))
Run Code Online (Sandbox Code Playgroud)

从我所理解的(integers-starting-from (+ n 1))将执行通过执行返回值的函数(cons-stream n (integers-starting-from (+ n 1)))).因为cons-streamis 的第二个形式参数(integers-starting-from (+ n 1)),并且因为它被包围( ),所以它将无限地一次又一次地执行该函数而不是延迟执行.

从我在执行这个片段之前看到的情况看来,即使是正在执行的流的秒元素,以下整数也会导致无限递归.

为什么这似乎适用于演讲期间所示的计划?

根据我的理解,它应该写成这样的东西:

(define (integers-starting-from n)
    (cons-stream n (lambda() (integers-starting-from (+ n 1)))))

(define integers (integers-starting-from 1))
Run Code Online (Sandbox Code Playgroud)

这是否意味着该方案有一些延迟执行的魔法(integers-starting-from (+ n 1))

先感谢您

Ósc*_*pez 8

诀窍在于我们如何实施cons-stream.您在定义(lambda () ...)thunk 时明确创建了评估承诺.特殊形式cons-stream执行此操作,但隐式使用Scheme的基元.例如,它可以像这样实现,注意我们如何使用delay:

(define-syntax stream-cons
  (syntax-rules ()
    ((stream-cons head tail)
     (cons head (delay tail)))))
Run Code Online (Sandbox Code Playgroud)

将所有承诺创建逻辑封装在一个地方更有意义,比如说cons-stream,而不是在任何地方明确地创建thunk.