如何重写Scheme中的“begin”?

2024-03-27

As the 维基百科 http://en.wikipedia.org/wiki/Scheme_(programming_language)#Standard_forms文章解释说,begin在Scheme中是一种库形式,可以使用更基本的形式重写,例如lambda.

但是你如何重写一个begin,特别是考虑以下因素?

x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28

你不能。事情是这样的begin有两个作用:一是对一堆有副作用的表达式进行排序,二是用来“拼接”宏结果。事实上你可以使用begin上面的定义是第二个功能的结果,您不能自己编写它。

如果你真的想了解整个故事,那么你could define begin作为简单的宏,它使它只执行排序方面的操作(它确实可以这样实现,尽管通常不是)。But,您需要添加显式识别begins 拼接定义(顶层或内部)。这意味着宏实现很好,但它不能真正成为一个库,因为核心扩展器应该知道它。 (并且因为该语言是词法​​范围的,所以核心扩展器没有好方法来识别begin核心语言中未定义的。)

总而言之,你可以说 R5RS 只是分类错误begin为“库语法”,因为它不能在库中定义......但即使这样也不完全准确,因为 R5RS 将“库语法”定义为“派生表达式”。因此,真正的错误点在于以下事实之一:begin两个面在其他地方实现,在扩展器中(用于定义上下文)。

另请注意,R6RS 澄清了整个交易:两个方面begin变得明确,现在它是核心语言的一部分,而不是“库形式”,甚至不是派生形式。

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

如何重写Scheme中的“begin”? 的相关文章

  • 将字符添加到频率列表

    我有一个关于霍夫曼编码的项目 但我陷入困境 我不明白为什么我的代码不起作用 这是练习 写一个函数add1给定一个字符 它在频率列表中的频率加 1 如果该字符尚未出现在频率列表中 则会添加该字符 add1 e l 1 e 2 x 1 l 1
  • 如何清除 Dr. Racket IDE 中的解释器屏幕?

    刚刚开始接触 The Little Schemer 有一个非常基本的 Dr Racket IDE 问题 如何清除口译员屏幕 如何设置向上箭头来显示之前输入的项目 如 Bash 中 而不是当前向上滚动屏幕的行为 我的搜索结果一片空白 可能是因
  • 为什么 eval 是邪恶的?

    我知道Lisp和Scheme程序员通常会这么说eval除非绝对必要 否则应避免 我已经看到了对几种编程语言的相同建议 但我还没有看到反对使用的明确论据列表eval 在哪里可以找到使用潜在问题的说明eval 例如 我知道以下问题GOTO在过程
  • 如何在Racket中使用TCP?

    我试图从客户端向服务器发送消息 并在服务器上打印该消息 服务器 rkt lang racket define the listener tcp listen 9876 define values in out tcp accept the
  • 如何创建像球拍一样的 make-curry 函数

    我想看看如何模仿 curry func that racket提供 下面是我如何手动柯里化函数的示例 lang sicp convert to a curried function define add1 x y x y define ad
  • 编写一个带有两个参数的 forAll 过程:系列的开始值和结束值,并将给定过程应用于该系列

    我正在尝试编写一个带有两个参数的 forAll 过程 一系列的开始值和结束值 生成的闭包还需要两个参数 一个应用于系列中所有元素的操作 以及一个初始值 这就是我所拥有的 我似乎遗漏了一些东西或者我不理解闭包背后的概念 define forA
  • 本地球拍

    我正在书中阅读有关本地定义的内容 并且遇到了这个例子 local define f x x 5 define g alon cond empty alon empty else cons f first alon g rest alon g
  • 对方案中的列表进行排序

    如何编写一个排序算法 以升序返回列表 ex 1 3 5 2 9 回报 1 2 3 5 9 大多数Scheme 实现都附带一个对列表进行排序的过程 如果您的实现没有提供这一功能 那么为您提供一个并不困难 下面是快速排序算法的实现 gt def
  • Scheme/Racket有枚举操作吗?

    Scheme Racket 是否有相当于 Haskell 中的 a b 表示法的枚举表示法 在 Haskell 中 1 5 计算结果为列表 1 2 3 4 5 for list i in range 1 6 i sequence gt li
  • 方案单词列表 eq?

    我有一个问题 我需要查找列表是否等于第二个列表 例如 set eq 1 2 3 1 2 3 gt t set eq 1 2 3 2 3 4 gt f 这些例子在我的程序中是正确的 但这个例子不是 set eq quote quote one
  • 删除重复项并对列表进行排序

    我正在尝试编写一个过程 该过程采用一个可能包含或不包含重复项的列表 然后按排序顺序返回没有重复项的列表 到目前为止我想到的是 define remove duplicated list if null list if car list ca
  • 按方案中的第一个元素对列表列表进行排序

    例如 我正在研究按第一个元素对列表列表进行排序 排序 列表 2 1 6 7 4 3 1 2 4 5 1 1 预期输出 gt 1 1 2 1 6 7 4 3 1 2 4 5 我使用的算法是冒泡排序 我修改了它来处理列表 但是 该代码无法编译
  • 如何重写Scheme中的“begin”?

    As the 维基百科 http en wikipedia org wiki Scheme programming language Standard forms文章解释说 begin在Scheme中是一种库形式 可以使用更基本的形式重写
  • 函数中的变量

    我看到了下面的代码 第一次调用 next num 回报1 第二个返回2 define next num let num 0 lambda set num num 1 num next num 1 next num 2 我无法理解的是 num
  • 经验丰富的计划者的 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
  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • 模拟Scheme中Python的范围

    如何在Scheme中创建连续数字的列表 在Python中创建一个从1到10的整数列表是range 1 11 方案有等效的吗 mzscheme version gives Welcome to Racket v5 2 1 Edit Per h
  • Letrec 和可重入延续

    有人告诉我 以下表达式的计算结果为 0 但许多方案的实现将其计算为 1 let cont f letrec x call with current continuation lambda c set cont c 0 y call with
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 方案如何返回多个值?

    我注意到几乎所有方案函数只能返回一个列表作为输出 下面 我想返回邻居的所有相邻节点的多个值 define neighbors l w if and 1 l 1 w list and l 1 w and 1 l w how to output

随机推荐

  • 是否有一个运算符可以作为 concatMap 但具有多个内部可观察值

    我正在使用可观察的对象来查询我的数据库 该可观察对象将返回一个数组 其中包含找到的所有匹配对象 我的问题是我想将可观察值映射到我将从另一个 API 检索的更多详细信息 我尝试了 concatMap 但它只让我在初始可观察值中嵌套 1 个可观
  • 测试互联网连接的最快方法

    C 2008 SP1 我正在使用此代码连接到我们的客户网站 这是针对软件电话应用程序的 在用户拨打电话之前 软件电话必须测试是否存在有效的互联网连接 因此 我要做的就是使用 httpWebRequest 类连接到我们的客户网站 如果响应正常
  • iPhone 电子邮件应用程序启动 URL

    在 iPhone 上启动电子邮件和开始新电子邮件的 URL 是 mailto 电子邮件受保护 cdn cgi l email protection 我只想启动电子邮件应用程序 将用户放在主菜单或收件箱中 mailto 开始撰写新的空白电子邮
  • 在谷歌应用程序脚本中解析 html 的最佳方法是什么

    var page UrlFetchApp fetch contestURL var doc XmlService parse page 上面的代码在使用时会出现解析错误 但是如果我用已弃用的 Xml 类替换 XmlService 类 并设置
  • 跟踪文件(Windows 终端)的硬链接(重新分析点?)?

    如何跟踪文件的硬链接 重新分析点 管道传输到格式列表不会显示目标 至少在 powershell 7 中 你会得到一个小 ascii 箭头 该文件夹位于 env path 中 如果您没有 Windows 终端 则 MicrosoftEdge
  • 权限是不可更改的权限类型

    背景 我正在尝试新的 Tiles 和 TileService 并决定重新创建 USB Tethering 磁贴CyanogenMod https github com CyanogenMod android frameworks base
  • 现在N层架构意味着什么?

    从传统意义上讲 N 层意味着将应用程序分成 层 并将每个 层 放在不同的服务器上 这样做至少有 3 个原因 维护 a 代码维护 更容易进行错误修复和功能添加 b 硬件维护 关闭一台服务器不会中断其他层的服务 性能 一台服务器的速度通常不够快
  • Python - 在这种情况下列表理解是否有效?

    这是Python中的输入 脏 列表 input list n data1 n data2 n n data3 n 每个列表元素包含带有换行符的空格或带有换行符的数据 使用下面的代码清理它 cleaned up list data strip
  • 在 Archlinux 上通过 Pyenv 编译 Python 但缺少 OpenSSL

    我正在尝试在新安装的 ArchLinux 上通过 pyenv 安装 python pyenv install 3 5 1Downloading Python 3 5 1 tar xz gt https www python org ftp
  • Javascript 字符串替换为计算

    有没有办法解决javascript中字符串中的数学表达式 例如 假设我想生成字符串 Tom has 2 apples Lucy has 3 apples Together they have 5 apples 但我希望能够替换变量 我可以通
  • 基于属性之一的 JSON 模式 anyOf 验证

    我很难弄清楚如何根据其中一个属性的值验证对象数组 所以我有一个 JSON 对象 例如 items name foo otherProperty bar name foo2 otherProperty2 baz otherProperty3
  • initWithNibName 没有被调用

    我需要将一些自定义逻辑放入我的 iPhone 应用程序中 以便根据您运行的 iOS 版本 选择不同的 XIB 文件 即 iPhone 或 iPad 将显示不同的 XIB 文件 我从第一天起就构建了整个 iPhone 应用程序 一切都很好 在
  • 使用构建器模式最多设置一次值

    Java 中是否有标准做法 在使用构建器模式时 确保成员变量最多设置一次 我需要确保 setter 被调用 0 或 1 次 但绝不会更多 我想扔一个RuntimeException某种类型的问题 但我担心同步问题以及该领域的最佳实践 什么也
  • unordered_set::find 的复杂性可以预测吗?

    在寻找适合我正在构建的应用程序的容器时 我浏览了以下文档unordered set 鉴于我的应用程序通常只需要insert and find函数 这个类看起来相当有吸引力 然而 我有点推迟了 因为find是 O 1 摊销 但最坏情况是 O
  • 页面刷新和带有 url 重写的角度路由后,cookie 计数为零

    我正在使用带有 net core 2 0 和 Angular 4 的 Angular Spa 模板 页面刷新后 我得到的 cookie 数量为零 事实上 页面刷新后我没有在 HttpContext 中得到任何内容 Here is my co
  • 在应用程序内将“精简版应用程序”转换为“专业应用程序”

    我在 App Store 中有两个应用程序 一种是免费版本 另一种是付费版本 我需要在应用程序本身中有一个名为 升级 的按钮 每当用户单击该按钮时 我们是否可以为会员提供使用应用内购买从精简版升级到专业版的功能 我们有直接在 iOS 6 中
  • 使用 BufferedReader 读取行并检查文件末尾

    如果我的代码中有这样的东西 String line r readLine Where r is a bufferedReader 如果下一行是文件末尾 如何避免崩溃 即空 我需要阅读下一行 因为那里可能有一些我需要处理的东西 但如果没有 代
  • Git 中的文件限制是多少(数量和大小)?

    有谁知道Git对文件数量和文件大小的限制是多少 此消息来自可以帮助您解决一些其他限制 CVS 即它实际上最终几乎面向 一个文件 一次 模型 这很好 因为你可以拥有一百万个文件 然后只检查 其中一些 你甚至永远不会see对方的影响 999 9
  • 如何将时间序列中的列除以 R 中的第一个值?

    我有下面的代码工作 但一定有更好的方法 file lt http s3 amazonaws com assets datacamp com production course 1127 datasets tmp file csv x lt
  • 如何重写Scheme中的“begin”?

    As the 维基百科 http en wikipedia org wiki Scheme programming language Standard forms文章解释说 begin在Scheme中是一种库形式 可以使用更基本的形式重写