问题标签 [r5rs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macros - 是否可以匹配 R5RS 宏定义语法/语法规则中的重复模式?
这个 R5RS 宏是我尝试过的,也是我想做的。球拍或其他实现不喜欢这个宏,正是我想要魔法发生的地方。
这在 Common Lisp 中很容易:
我也一直在阅读定义语法入门并认为 is-eqv 的实现?会为我指出正确的方向,但似乎它不是在那里定义的宏。
如果在 R5RS 编译时不可能,那么如何使用 R6RS 来完成?
scheme - 方案 R5RS 的 ANTLR 文法
我是 ANTLR 的初学者,我正在通过一个例子来学习它。我使用 C 作为我的目标语言。该示例是取自此问题的 Scheme R5RS 语法文件,稍作修改(重命名语法名称并添加一些选项,语法规范不变)。
antlr 生成了词法分析器和解析器,我用一个测试编译它main()
,我只是做一些初始化并简单地调用解析器。当使用一段方案代码运行测试程序时,解析器检测到一些语法错误(这不应该发生!)
main
test.c 中的函数
test.scm 中的方案代码:
终端输出:
我已经阅读了语法规范,它是正确的。我无法弄清楚问题出在哪里......有人可以帮忙吗?谢谢!
======================回复=========================
按照 and 的语法规则pattern
,template
我下到了下面的代码片段。我认为解析将template
与之匹配并失败,因为template
没有quasiquote
替代方案。
我相信 for 的语法规则template
正确地遵循了 R5RS 规范,并且该代码被其他 R5Rs 方案实现所接受(我在 scheme48 和 guile 中对其进行了测试)。这怎么可能发生?
我想我的分析一定有问题……
random - 无限随机流
我在创建从 0 到 9 的无限随机数字流时遇到了一些麻烦。这就是我现在所处的位置:
唯一的问题是,(random 9)
似乎只启动了一次。流确实是随机的,但流的值保持不变。
我得到7, 7, 7, 7, 7
或3, 3, 3, 3, 3
关于每次无限循环重新开始时如何启动随机函数的任何想法?我已经在网上搜索了所有内容,但找不到任何方法来解决这个问题。
scheme - 如何在 R5RS 中编程?
我需要帮助在 dr Racket 中以 r5rs 的语法对此进行编码。调整函数,使其计算前 n 个偶数的总和
compiler-construction - 是否有不同“RnRS”方案标准的摘要?
我需要为学术编译器实现选择一个方案标准。它必须足够简单,但仍然应该是一种强大的语言。Scheme有几个(RRS-R7RS)标准。这些报告是否有公开比较以供选择?如果不是,您会推荐哪一个作为第一个编译器?
lisp - Scheme中'define'的返回值是多少?
我很好奇define
in Scheme 的返回值。所以我在 Racket 中写了以下几行
并得到错误
我对此有两个问题:
- 这是否意味着
define
没有返回值? - 根据 R5RS,
define
不是表达式。这是一个程序结构。只有表达式有返回值,而其他形式没有,这是真的吗?
scheme - 方案函数只接受一个输入值而不是两个
我在下面有一个此功能,可让它打印您输入的列表(iota 1 10),因此在列表中打印数字 1-10(1 2 3 4 5 6 7 8 9 10)。我如何将其更改为仅取一个数字并仍从列表中的 1-(所选数字)打印。我只是想不通我应该怎么做。谢谢。
lambda - lambda 如何在方案中处理其主体内的未绑定变量?
在此代码段中:
当(set! f (lambda...))
被评估时,变量 g 不绑定到任何位置。正如 R5RS 的规范(链接在这里)所说:
计算 lambda 表达式时生效的环境将作为过程的一部分被记住。当稍后使用一些实际参数调用过程时,将通过将形式参数列表中的变量绑定到新位置来扩展评估 lambda 表达式的环境,相应的实际参数值将存储在这些位置,并且lambda 表达式主体中的表达式将在扩展环境中按顺序计算。
其中“有效环境”在某一时刻被定义为:
命名位置的标识符称为变量,并且被称为绑定到该位置。在程序中某个点生效的所有可见绑定的集合称为该点生效的环境。
所以内部 lambda 应该只捕获像这样的环境{f: (location #1)}
;并且当通过调用(f 5)
用于评估其主体的环境来评估它时,它应该是{f: (location #1), x: (location #2)}
不包含g
.
但是 DrRacket(还有 petite,它是一个 R6RS 实现)在评估上述代码段时给出了 10。所以环境确实包含g
. 为什么?
=====
似乎该方案要求定义语句仅出现在<body>
. 但此代码段也返回 10:
map - 应用程序不是程序(方案映射程序)
我正在尝试在 R5RS 中编写自己的简化地图程序。简而言之,它接受一个过程和两个列表,并返回一个列表,其中包含在两个参数列表中的每对对象上调用的过程的结果,直到其中一个为空。
这适用于算术运算符,例如:
但是,当我尝试传递返回 #t 或 #f 的匿名 lambda 函数(我的 both? 过程的返回值)时,这不起作用。
我在 DrRacket 中收到的具体错误是:
如果有人能告诉我如何纠正这个错误,我会很高兴。我不明白为什么这段代码自己会失败。
scheme - 我在 DrRacket 做错了什么
所以我读到 DrRacket 是一个很好的通用 lisp IDE。我下载了它并将语言设置为R5RS并编写了以下函数定义:
但是它返回一个错误
而且我不知道如何解决它,考虑到 defun 是 common lisp 中一个完善的关键字。