SICP 第 3.1.1 节 - 程序中的本地状态似乎不一致

2024-01-03

我正在努力完成 SICP。我在第3.1.1节 http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html并查看当地状态。我正在 GNU Guile v2.0.11 中评估这些练习。

我确实找到了一个关于本节的类似问题 https://stackoverflow.com/questions/26696927/local-state-of-a-variable,但这似乎没有解决我正在努力解决的问题,或者我太迟钝了。

我正在看的两个例子是:

(define new-withdraw
  (let ((balance 100))
    (lambda (amount)
      (if (>= balance amount)
          (begin (set! balance (- balance amount))
                 balance)
          "Insufficient funds"))))


(define (make-withdraw balance)
  (lambda (amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds")))

当我将第一个分配给变量时:

(define a new-withdraw)
(define b new-withdraw)

我得到两个指向同一个过程对象的指针,并且状态在它们之间共享:

scheme@(guile-user)> a 
$1 = #<procedure 1165880 at /path/to/file (amount)>
scheme@(guile-user)> b
$2 = #<procedure 1165880 at /path/to/file (amount)>
scheme@(guile-user)> (a 50)
$3 = 50
scheme@(guile-user)> (b 10)
$4 = 40

然而,当我实现第二个过程时,我得到了指向两个具有不同状态的不同过程对象的指针:

scheme@(guile-user)> (define c (make-withdraw 100))
scheme@(guile-user)> (define d (make-withdraw 100))
scheme@(guile-user)> c
$5 = #<procedure 14fdac0 at /path/to/file (amount)>
scheme@(guile-user)> d
$6 = #<procedure 1508360 at /path/to/file (amount)>
scheme@(guile-user)> (c 50)
$7 = 50
scheme@(guile-user)> (d 10)
$8 = 90

我已通读该部分,但对此没有明确的解释,并且当我搜索该部分时我无法找到任何内容。我了解一般状态方面发生的情况,但我不明白这些过程之间的区别是什么,允许一个拥有单一的通用状态,另一个保持本地状态。

为什么第一个定义“new-withdraw”无法跨多个分配维护本地状态?每次我们进行不同的分配(定义 new-withdraw)时,lambda 似乎都应该捕获余额为 100 的分配。


原因是在第二个示例中每次都返回一个新的闭包,而在第一个示例中只有一个闭包,因此只有一个状态。

如果您希望第一种情况与第二种情况具有相同的行为,请更改为:

(define (new-withdraw) ; this is a procedure now
  (let ((balance 100))
    (lambda (amount)
      (if (>= balance amount)
          (begin (set! balance (- balance amount))
                 balance)
          "Insufficient funds"))))

(define a (new-withdraw)) ; called as a procedure
(define b (new-withdraw))

then

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

SICP 第 3.1.1 节 - 程序中的本地状态似乎不一致 的相关文章

  • 更新已编辑输入的值

    我在用react admin框架 我正在尝试动态更新我的输入值 在我的自定义组件中 我有onChange 方法如下所示 onChange value gt this setState currentForm this props recor
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • “关闭”某物是什么意思?

    我试图理解闭包 但从字面上看every我能找到的闭包定义使用了相同的神秘而模糊的短语 结束 什么是closure 哦 这是一个函数结束另一个功能 但我找不到 结束 的定义 有人能解释一下 A 事物 关闭 B 事物意味着什么吗 闭包是由代码指
  • 如何在 WooCommerce 管理订单列表上创建过滤器下拉菜单?

    我正在尝试创建一个运输状态WooCommerce 管理订单列表上的过滤器下拉菜单 首先 我在管理订单列表中添加了一个用于运输状态的自定义列 add filter manage edit shop order columns custom s
  • 经验丰富的计划者的 get-first、get-next 和 waddle 函数

    define get first lambda l call with current continuation lambda here set leave here waddle l leave quote define get firs
  • C++ 支持编译时计数器吗?

    出于自省的目的 有时我想自动将序列号分配给类型或类似的东西 不幸的是 模板元编程本质上是一种函数式语言 因此缺乏实现此类计数器的全局变量或可修改状态 或者确实如此 根据请求的示例代码 include
  • 从扩展类调用时,groovy 中的闭包不能使用私有字段

    我有一个 groovy 课程 其中有一个私有字段和一个方法 在该方法中 我调用 http 服务 并在其中传递一个闭包来处理响应 像这样的事情 class WebUiRestRequestSender private String jSess
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • Scala 闭包如何转换为 Java 对象?

    我目前正在研究不同语言的闭包实现 然而 当谈到 Scala 时 我找不到任何有关如何将闭包映射到 Java 对象的文档 Scala 函数映射到 FunctionN 对象是有据可查的 我假设对闭包的自由变量的引用必须存储在该函数对象中的某个位
  • 是否可以在 C++11 之前创建函数局部闭包?

    借助 C 11 我们获得了 lambda 并且可以在我们真正需要的地方 而不是在它们不真正属于的地方 即时创建函数 函子 闭包 在 C 98 03 中 创建函数局部函子 闭包的好方法如下 struct void operator int i
  • Flutter:webview_flutter 更新同一 webview 小部件中的 url

    嘿 我正在尝试创建一个屏幕 显示带有底部应用栏的网络视图 因此 您加载网络视图 当点击底部应用栏中的某个项目时 其他网站应该加载到同一个网络视图中 除了我最初解析的网站之外 我不知道如何打开另一个网站 我尝试使用 setState 更新网址
  • 比使用流保存增强随机生成器状态更快的替代方案

    我需要能够保存 加载这个增强随机生成器的状态 boost variate generator
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • 大括号 {} 替换 Racket 中的“开始”

    是否可以有一个宏 使用大括号 来表示一个语句块 从而替换 begin 关键字 因此 代替 if condition begin statement1 statement2 statement3 statement4 else stateme
  • Angular Digest 循环正在运行,但 ng-bind 值未更新

    我有一个包含导航栏的父视图 在该视图内部我有一个 div 渲染我所在的任何子视图的元素 我想根据子视图的路线有条件地显示 隐藏父视图中的导航栏 现在 我有这个 div
  • Swift:ViewModel 应该是结构体还是类?

    我正在尝试在我的新项目中使用 MVVM 模式 第一次 我创建了所有的视图模型来构建 但是 当我使用闭包实现异步业务逻辑 例如 fetchDataFromNetwork 时 闭包捕获旧视图模型值 然后更新为该值 不是新的视图模型值 这是操场上
  • Swift loadItem 关闭未运行

    我正在编写一个共享扩展 但捕获并保存共享附件的闭包未运行 我怎样才能找出原因 switch 分支执行 附件就在那里 没有错误消息 它只是永远不会运行 if let contents content attachments as NSItem
  • 提交后清除 React 中的表单

    我试图在使用 Axios 创建表单提交后清除表单数据 消息处理良好 响应记录到页面 但每个文本字段中的数据在提交后仍保留在页面上 我尝试添加一个resetForm函数 我将表单设置回原来的空白状态 但这不起作用 import React C
  • React Native 将样式设置为 State

    我想用backgroundColor of style1作为一种状态 并在函数中改变它change 我怎样才能访问style1 我的观点是调用该函数change从另一个函数 使按钮将其颜色更改为黄色 然后在一段时间后再次将其颜色更改为蓝色
  • 无法实现模块模式

    我正在尝试重现 Douglas Crockford 所著的 Javascript The Good Parts 一书中的一些代码 这个想法是使用闭包进行对象封装并避免Javascript固有的全局变量 var serial maker fu

随机推荐

  • crypto.createHash sha512 与 hexDigest 输入类型

    我试图获得与我获得的相同结果http jssha sourceforge net http jssha sourceforge net where 我有问题的是 测试 这个词 var word testing var hex toHex w
  • WordPress 要求我提供 FTP 凭据来安装插件

    我在本地系统中安装了 WordPress 博客 但是当我尝试从管理员添加插件时 它要求 FTP 访问权限 我需要配置什么才能使 WordPress 能够在不使用 FTP 的情况下上传 尝试在wp config php中添加代码 define
  • 使用多个分隔符提取文本

    我有带分隔符的字符串列表A and B L sgfgfqds A aaa sderas B ffff eeee sdsdfd A rrr 并需要 L1 aaa ffff eeee rrr 我尝试使用 L1 re findall r lt A
  • 如何在片段中按下后退按钮时显示警告消息

    我希望应用程序在用户按下后退按钮时显示警告消息 如果用户选择 是 它将返回 我在导航图片段中 我在堆栈溢出中搜索了很多次并尝试过 Override public void onBackPressed AlertDialog Builder
  • 嵌套viewpager2

    我正在尝试实现这样的布局 我附上了示例项目 https drive google com file d 1jEKOONMWN3MblLN1EmePsWTWNCNQVfN view usp sharing https drive google
  • 基于 C++ 模板的 get()

    我有一个班级 其中有几个 类似 类型的成员 例如 class Container C1 c1 C2 c2 C3 c3 template
  • Debianizing Python 程序以获得 .deb [重复]

    这个问题在这里已经有答案了 Aim 创建一个可安装的 deb文件 或包 单击该按钮将在 Linux 计算机上安装该软件 并且图标将放置在 GNOME 面板上 以便从那里启动该应用程序 我所提到的 我参考了两个 debianizing 指南
  • 使用“mvn test”进行参数化 JUnit 测试是否正确?

    我刚刚使用 JUnit 测试用例实现了JUnit4 11 下面的例子 https github com junit team junit blob master doc ReleaseNotes4 11 md example 1 https
  • WebView显示黑屏

    我有点不好意思发这个帖子 但我似乎不明白 我哪里出错了 我已经看过每一个例子和每一个 教程和一切对我来说都很合适 这就是我正在做的事情 我 有一个列表视图 当您单击某个项目时 它将带您进入 显示一些与之关联的静态格式文本的 WebView
  • 等待 RxJs.Subscriptions 完成后再恢复

    在我的 Angular 2 应用程序中 我需要发出一系列 http 请求 我有两个服务 A 和 B 每个服务都发出请求 A get and B get 从 API 获取数据并将其存储在其服务中 这两个可以同时调用 但是我有第三个请求doSo
  • 用Python绘制盒子

    平台 WinXP SP2 python 2 5 4 3 活跃状态分布 有谁写成功了盒子绘图字符 http en wikipedia org wiki Box drawing characters在Python中 当我尝试运行这个时 prin
  • addEventListener('keydown',handlekeydown,false) 与 .onkeydown 的工作方式不同,用于替换键入的击键

    我正在使用 keydown 事件来替换在输入文本框中键入的特定字符 当我使用时 document getElementById inputText onkeydown handleInputTextKeydown 或 JQuery 等效项
  • 为什么在尝试拆分一行输入并分配给多个变量时会出现 ValueError?

    我尝试了一些像这样的代码来从文件中读取问题和答案对 questions list answers list with open qanda txt r as questions file for line in questions file
  • 我应该如何使用服务器端和客户端代码编写 Node.js Web 应用程序?

    我计划编写一个 spin backbone js 风格的 Web 应用程序 它基本上只是将一个大型 application js 文件传输到客户端的浏览器 该浏览器使用 ajax 与 node js 后端进行通信 问题是我不知道如何构建这样
  • 对于自定义错误,我应该使用什么 HTTP 状态代码?

    我需要返回有关错误的信息 例如 客户的联系人不能超过 3 个 作业字段为空 超出操作限制 我需要发送带有自己的状态代码的每个错误吗 我可以用吗400 BadRequest对于所有这些错误 我可以使用 400 BadRequest 来处理所有
  • Tensorflow 无法预测足够准确的结果

    我对我在 Tensorflow 项目中选择的算法有一些基本问题 我输入了大约 100 万组训练数据 但仍然无法获得足够准确的预测结果 我使用的代码基于旧的 Tensorflow 示例 https github com tensorflow
  • 学习 Delphi 最简单/最有效的方法是什么?

    我对编程完全陌生 我选择 Delphi 作为我想学习的编程语言 我基本上想构建使用套接字填写和提交 Web 表单的工具 并且我希望它们也是多线程的 我希望它们功能丰富并且性能正确 我并不急于这样做 因为我确实知道任何事情 尤其是编程 都需要
  • 持续集成工具

    我正在研究持续集成工具及其好处 对于我的研究 我正在研究以下工具 亚搏体育appGitLab持续集成 Jenkins Bamboo GoCD TeamCity 现在我不会打扰你所有的要求和好处 但到目前为止 除了这些之外 我还没有发现这些工
  • 如何在文本输入中插入很棒的字体图标? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 如何将日历网络字体图标插入我的输入字段 HTML
  • SICP 第 3.1.1 节 - 程序中的本地状态似乎不一致

    我正在努力完成 SICP 我在第3 1 1节 http mitpress mit edu sicp full text book book Z H 20 html并查看当地状态 我正在 GNU Guile v2 0 11 中评估这些练习 我