stream - SICP 无限流(第 3.5.2 章)

标签 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-来自 (+ 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/

相关文章:

lisp - Lisp 中的相等函数

c++ - 为什么在尝试读取数字和非数字输入的混合时某些字符串会被截断,如以下代码所示?

java - ServletOutputStream内存堆错误大文件流

list - 方案:将列表映射为函数的参数

macros - 宏发出 : Eval of a macro body works, 但宏没有

functional-programming - Lisp - 在 n 个列表中拆分列表

lambda - Java 8 Stream 每 100 行读取一次文件

python - 特定收件人使用Redis和python使用故障安全消息广播

swift - 方案 : possible in Swift? 中可爱的 lambda 技巧

list - Scheme自定义关联列表实现