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))?
先感谢您
诀窍在于我们如何实施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.