SICP 3.52 延迟 CDR

2023-12-14

练习3.52,

(define sum 0)

(define (accum x)
  (set! sum (+ x sum))
  sum)

;1: (define seq (stream-map accum (stream-enumerate-interval 1 20)))
;2: (define y (stream-filter even? seq))
;3: (define z (stream-filter (lambda (x) (= (remainder x 5) 0))
;                           seq))

;4: (stream-ref y 7)
;5: (display-stream z)

Step 1: ;1: ==> (cons-stream 1 (stream-map proc (stream-cdr s))(认为stream-cdr仅当我们强制时才评估cdr该流的)

sum现在是 1

Step 2: 1 is not even,因此(也已记忆,因此不再添加),它调用(stream-filter pred (stream-cdr stream))。 这导致 评估cdr从而具体化2 which is甚至,因此它应该调用:(cons-stream 2 (stream-cdr stream)).

根据这个答案应该是 1+2 = 3 ,但它是 6

有人可以帮忙解释为什么吗cdr's car在当前之前实现cdr叫做?


Using 丹尼尔·P·弗里德曼的记忆tail

#lang r5rs

(define-syntax cons-stream
  (syntax-rules () 
    ((_ h t) (cons h (lambda () t)))))

(define (stream-cdr s)
  (if (and (not (pair? (cdr s)))
           (not (null? (cdr s))))
      (set-cdr! s ((cdr s))))
  (cdr s))

我们观察到:

> sum
0
> (define seq (stream-map accum (stream-enumerate-interval 1 20)))
> sum
1
> seq
(mcons 1 #<procedure:friedmans-tail.rkt:21:26>)
> (define y (stream-filter even? seq))
> sum
6
> seq
(mcons
 1
 (mcons
  3
  (mcons 6 #<procedure:friedmans-tail.rkt:21:26>)))
> y
(mcons 6 #<procedure:friedmans-tail.rkt:21:26>)
> 

stream-filter?需要获取它正在构造的流的第一个元素才能构造它。流的头元素已经被强制、计算,因此它必须已经存在。

在枚举区间 1 到 20 的累加和列表中,第一个偶数为 6:

1      = 1
1+2    = 3
1+2+3  = 6
...

在球拍中运行。

要查看更多信息,请同时命名枚举序列:(define nums (stream-enumerate-interval 1 20)), (define seq (stream-map accum nums)),并检查numsseq等等,同时一一尝试表达方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SICP 3.52 延迟 CDR 的相关文章

  • OpenXML 在写入元素时挂起

    我有一个程序 它基本上从数据库中提取数据 将其缓存到文件中 然后将该数据导出为多种格式 Excel Excel 2003 CSV 我正在使用 OpenXML SDK 2 0 来完成 Excel 工作 这些导出过程并行运行 使用Paralle
  • 方案/球拍:画布操作

    1 正如标题所述 当我调整窗口大小时 我绘制的对象消失 但矩形保持原样 2 原点从左上角开始 但我希望它在左下角 3 除了绘图库之外 我找不到任何缩放功能 所以如果我希望实现这样的功能 一个选项是通过绘制更大的对象并刷新画布来 缩放 def
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 如何将音频添加到我的 ffmpeg 流中

    我想将音频添加到我的 ffmpeg cli 中 ffmpeg framerate 25 video size 1920x1080 f x11grab i 0 0 vf format yuv420p http localhost 8080 f
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 分析云数据流 BigQuery 吞吐量/管道

    我试图弄清楚 DataFlow 如何扩展某些操作以及如何使其表现最佳 首先 我刚刚创建了一个简单的流程 从 BigQuery 读取数据 约 25M 行 总共 30GB 执行 JSON 提取 按键进行简单的分组 然后对分组进行聚合 每个约 1
  • ffmpeg流rc缓冲区下溢

    目前我正在使用开源工具 ffmpeg ffserver 建立一个屏幕共享平台 分享之初一切都很好 大约 1 1 2 分钟后 我在输出中得到以下异常 flv 0x3a47aa0 rc buffer underflow flv 0x3a47aa
  • 不知道如何解决 SICP 练习 1.11

    练习1 11 http mitpress mit edu sicp full text book book Z H 11 html thm 1 11 一个功能f由以下规则定义f n n if n lt 3 and f n f n 1 2f
  • REtful POST :要写入流的字节超过指定的 Content-Length 字节大小

    抛出此错误 Bytes to be written to the stream exceed the Content Length bytes size specified 当我运行以下代码时 var request HttpWebRequ
  • 即使使用stream_set_blocking,PHP SSH2流内容仍为空?

    我正在开发一个工具 它使用 PECL SSH2 扩展通过 SSH2 从远程主机读取 iptables 配置 我能够成功连接到主机 进行身份验证并执行命令 我遇到的问题是有时该流不包含任何数据 Load the current firewal
  • 如果您不打算从自适应渲染中受益,那么使用 HtmlTextWriter 有什么好处吗?

    除了从替代设备的自适应渲染中受益之外 编写所有这些代码是否有意义 writer WriteBeginTag table writer WriteBeginTag tr writer WriteBeginTag td writer Write
  • 如何将 futures::Stream 写入磁盘而不先将其完全存储在内存中?

    这里有一个使用 Rusoto S3 下载文件的示例 如何将从 S3 使用 Rusoto 下载的文件保存到我的硬盘 https stackoverflow com questions 51287360 how to save a file d
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • 如何创建惰性序列向量

    运行它按预期工作 defn long seq n lazy seq cons list n somekey n 2 long seq n 1 take 3 long seq 3 gt 3 somekey 6 4 somekey 8 5 so
  • 在 HTML5 websocket 服务器中切割媒体流,用于基于网络的聊天/视频会议应用程序

    我们目前正在开发一个聊天 文件共享 视频会议应用程序使用 HTML5 websocket https stackoverflow com questions 4220672 implementing webbased real time v
  • 方案语言:合并两个数字

    如何将列表中的两个整数合并为一个 方案中 例子 11 223 gt 11223 假设列表恰好有两个元素 并且都是数字 define merge numbers lst let 1st number gt string first lst 2
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo

随机推荐